当Firefox说“因为包含错误而无法显示图像”时,如何找出错误是什么?

问题描述 投票:4回答:5

我有一个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;
    } 
}


function noisecolor()
// Fonction permettant de dÈterminer la couleur du bruit et la forme du pinceau
 {
 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;    
}


function bruit()
//Adding noise: points, lines and circles random
{
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 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"),它会消除错误,但会向浏览器返回废话,如下所示:

(所有这些说,我对修复这个特定的图像文件不太感兴趣,而不是理解如何在图像创建文件中调试错误/意外行为。我想学习如何自己解决有问题的图像生成文件。)

php google-chrome firefox asp.net-core
5个回答
1
投票

这是一个棘手的问题,不是吗?

您的脚本包含该行

echo('here!'); //prints here to the screen

这将ASCII字符串“here”添加到PNG数据流中,从而破坏图像。

提示:如果您下载脚本的结果(使用例如wget,或简单地在Firefox中“保存页面”),并在编辑器中打开文件,您将很快看到问题。


0
投票

注释掉header()所以它只发回数据而不是image/png


0
投票

阅读您的PHP错误日志,您将找到确切的错误。很可能PHP正在抛出警告,这就是您在浏览器上看到此错误的原因。


0
投票

也许你的PHP脚本搞砸了你的图像。无法报告逻辑错误,您必须自己查找。要打开常规错误报告,请查看以下链接:How do I enable error reporting in PHP?

启用错误记录Where does PHP store the error log? (php5, apache, fastcgi, cpanel)


0
投票

在ASP.Net CORE应用程序中,您可能想将图片文件放在解决方案下名为Images的文件夹中,但您需要将它们放在wwwroot / images文件夹中:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.