6

画像を作成するPHPファイルがあります。画面にエラーを報告するように PHP を構成しました。Firefox 23 で PHP ファイル内のファイルを実行すると、the Image cannot be displayed because it contains errors.

画像内の特定のエラーの原因を特定するにはどうすればよいですか?

コードは次のとおりです。

<?php
    $tfont[] = 'cylburn-webfont.ttf';

    $cryptinstall = "./cryptographp.fct.php";
    include $cryptinstall;

    error_reporting(E_ALL ^ E_NOTICE);
    srand((double)microtime()*1000000);

    if ($_GET[$_GET['sn']] == "")
        unset ($_GET['sn']);

    session_start();

    include('getcaptcha.php');
    $question = getcaptcha();
    $questionLen = strlen($question);
    $cryptwidth  = 25 * $questionLen;

    $cryptinstall2 = "./cryptographp.cfg.php";
    include $cryptinstall;

    $cryptwidth = 900;
    $cryptheight = 200;

    // CrÈation du cryptogramme temporaire
    $imgtmp = imagecreatetruecolor($cryptwidth, $cryptheight);
    $blank  = imagecolorallocate($imgtmp, 255, 255, 255);
    $black   = imagecolorallocate($imgtmp, 0, 0, 0);
    imagefill($imgtmp, 0, 0, $blank);

    $word = '';
    $x = 10;
    $pair = rand(0, 1);
    $charnb = rand($charnbmin, $charnbmax);


    for ($i=0; $i<= $questionLen; $i++) {
         $tword[$i]['font'] =  $tfont[array_rand($tfont, 1)];
         $tword[$i]['angle'] = (rand(1, 2) == 1) ? rand(0, $charanglemax) : rand(360-$charanglemax, 360);

         $tword[$i]['element'] = str_split($question)[$i-1];

         $tword[$i]['size'] = rand($charsizemin, $charsizemax);
         $tword[$i]['y'] = ($charup ? ($cryptheight/2) + rand(0, ($cryptheight/5)) : ($cryptheight/1.5));
         $word .= $tword[$i]['element'];

         $lafont = "fonts/" . $tword[$i]['font'];
         imagettftext($imgtmp, $tword[$i]['size'], $tword[$i]['angle'], $x, $tword[$i]['y'], $black, $lafont, $tword[$i]['element']);

         $x += $charspace;
     }

    // Calculate horizontal racadrage temporary cryptogram
    $xbegin = 0;
    $x = 0;
    while (($x<$cryptwidth)and(!$xbegin)) {
        $y = 0;
        while (($y<$cryptheight) and (!$xbegin)) {
            if (imagecolorat($imgtmp, $x, $y) != $blank)
                $xbegin = $x;
            $y++;
        }
        $x++;
    }

    $xend = 0;
    $x = $cryptwidth-1;
    while (($x>0) and (!$xend)) {
        $y = 0;
        while (($y<$cryptheight)and(!$xend)) {
            if (imagecolorat($imgtmp, $x, $y) != $blank)
                $xend = $x;
            $y++;
        }
        $x--;
    }

    $xvariation = round(($cryptwidth/2)-(($xend-$xbegin)/2));
    imagedestroy ($imgtmp);

    // Create the final cryptogram
    // Create the background
    $img = imagecreatetruecolor($cryptwidth, $cryptheight);

    if ($bgimg and is_dir($bgimg)) {
        $dh  = opendir($bgimg);
        while (false !== ($filename = readdir($dh)))
            if(eregi(".[gif|jpg|png]$", $filename))
                $files[] = $filename;
                closedir($dh);
                $bgimg = $bgimg . '/' . $files[array_rand($files, 1)];
    }

    if ($bgimg) {
        list($getwidth, $getheight, $gettype, $getattr) = getimagesize($bgimg);
            $imgread = imagecreatefrompng($bgimg); break;
            imagecopyresized($img, $imgread, 0, 0, 0, 0, $cryptwidth, $cryptheight, $getwidth, $getheight);
            imagedestroy ($imgread);
        }
        else {
            $bg = imagecolorallocate($img, $bgR, $bgG, $bgB);
            imagefill($img, 0, 0, $bg);
            if ($bgclear)
                imagecolortransparent($img, $bg);
        }


    function ecriture()
    {
        // CrÈation de l'Ècriture
        global  $img, $ink, $charR, $charG, $charB, $charclear, $xvariation, $charnb, $charcolorrnd, $charcolorrndlevel, $tword, $charspace;
        $ink = imagecolorallocatealpha($img, $charR, $charG, $charB, $charclear);

        global $question;
        global $questionLen;

        $x = $xvariation;
        for ($i=1; $i<$questionLen; $i++) {

            if ($charcolorrnd) {   // Choisit des couleurs au hasard
                $ok = false;
                do {
                    $rndcolor = 0;
                    switch ($charcolorrndlevel) {
                        case 1 :
                            if ($rndcolor<200)
                                $ok = true; break; // tres sombre

                        default : $ok = true;
                    }
                } while (!$ok);

                $rndink = imagecolorallocatealpha($img, $rndR, $rndG, $rndB, $charclear);
            }

            $lafont = "fonts/" . $tword[$i]['font'];
            imagettftext($img, $tword[$i]['size'], $tword[$i]['angle'], $x, $tword[$i]['y'], $charcolorrnd ? $rndink : $ink, $lafont, $tword[$i]['element']);

            $x += $charspace;
        }
    }


    // Fonction permettant de dÈterminer la couleur du bruit et la forme du pinceau
    function noisecolor()
    {
        global $img, $noisecolorchar, $ink, $bg, $brushsize;
        switch ($noisecolorchar) {
            case 1  : $noisecol = $ink; break;
            case 2  : $noisecol = $bg; break;
            case 3  :
            default : $noisecol = imagecolorallocate ($img, 0, 0, 0); break;
        }

        if ($brushsize and $brushsize>1 and function_exists('imagesetbrush')) {
            $brush = imagecreatetruecolor($brushsize, $brushsize);
            imagefill($brush, 0, 0, $noisecol);
            imagesetbrush($img, $brush);
            $noisecol = IMG_COLOR_BRUSHED;
        }
        return $noisecol;
    }


    //Adding noise: points, lines and circles random
    function bruit()
    {
        global $noisepxmin, $noisepxmax, $noiselinemin, $noiselinemax, $nbcirclemin, $nbcirclemax, $img, $cryptwidth, $cryptheight;
        $nbpx = rand($noisepxmin, $noisepxmax);
        $nbline = rand($noiselinemin, $noiselinemax);
        for ($i=1; $i<$nbpx; $i++)
            imagesetpixel($img, rand(0, $cryptwidth-1), rand(0, $cryptheight-1), noisecolor());
            for ($i=1; $i<=$nbline; $i++)
                imageline($img, rand(0, $cryptwidth-1), rand(0, $cryptheight-1), rand(0, $cryptwidth-1), rand(0, $cryptheight-1), noisecolor());
    }


    if ($noiseup) {
        ecriture();
        bruit();
    }
    else {
        bruit();
        ecriture();
    }


    // Create the frame
    if ($bgframe) {
       $framecol = imagecolorallocate($img, ($bgR*3 + $charR)/4, ($bgG*3 + $charG)/4, ($bgB*3 + $charB)/4);
       imagerectangle($img, 0, 0, $cryptwidth-1, $cryptheight-1, $framecol);
    }


    // Transformations supplÈmentaires: Grayscale et Brouillage
    // VÈrifie si la fonction existe dans la version PHP installÈe
    if ($cryptgrayscal)
        imagefilter($img, IMG_FILTER_GRAYSCALE);
    if ($cryptgaussianblur)
        imagefilter($img, IMG_FILTER_GAUSSIAN_BLUR);

    /* If I comment out these lines, then the file runs fine, but
       of course it does not return an image.
    header("Content-type: image/png"); // This is the only header(...) that is
                                       // included in the file. I am requesting
                                       // the file directly with the URL.
    imagepng($img);

    imagedestroy ($img);
    unset ($word, $tword);
    unset ($_SESSION['cryptreload']); */
?>

をコメントアウトするheader("content-type: image/png")と、エラーは解消されますが、ブラウザには次のような意味のないものが返されます。

ここに画像の説明を入力してください

(とは言っても、この特定のイメージ ファイルを修正することよりも、イメージ作成ファイルでエラーや予期しない動作をデバッグする方法を理解することに興味があります。問題のあるイメージ生成ファイルを自分で修正する方法を学びたいと思っています。)

4

9 に答える 9

0

をコメントアウトして、header()ではなくデータのみを送り返すようにしますimage/png

于 2013-09-02T09:14:26.747 に答える
0

この質問に出くわした他の人に役立つかもしれないsupport.mozilla.org のスレッドからの回答を次に示します。

これの非常に一般的な理由は、画像の種類がファイル拡張子と一致しないことです。これにより、Web サーバーは間違った MIME タイプを報告します。たとえば、Photoshop の画像を .jpg ファイルに名前を変更して Web サーバーに配置すると、Firefox に読み込まれません。

この問題のトラブルシューティングに取り組んでいる場合は、ファイルをダウンロードして、ファイルの種類が jpg と一致することを確認してください。.psd ファイルを取得して .jpg に名前を変更し、それを Web サーバーにアップロードしたクライアントのために、今日これを修正しました。

于 2020-03-27T12:40:30.220 に答える
0

おそらく、PHP スクリプトが画像を台無しにしてしまったのでしょう。論理エラーは報告できません。自分で見つけなければなりません。通常のエラー報告を有効にするには、次のリンクを確認してください: PHP でエラー報告を有効にするにはどうすればよいですか?

エラー ログを有効にするに は PHP はエラー ログをどこに保存しますか? (PHP 5、Apache、FastCGI、および cPanel)

于 2013-09-02T20:40:18.710 に答える