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

时间:2013-09-02 09:12:28

标签: php google-chrome firefox asp.net-core

我有一个制作图片的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"),它会消除错误,但会向浏览器返回废话,如下所示:

enter image description here

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

9 个答案:

答案 0 :(得分:1)

首先确保在 header() 命令输出任何内容之前,您的代码没有任何部分。 如果您在标题之前有任何包含,请确保您没有使用 ?> 完成您的 php,因为有时这会生成一个字节。 最后尝试将您的包含包裹在 ob_start() 中;和 ob_end_clean();因为这将确保不会由于任何其他原因将随机字节转换为输出(我发生过一次)

答案 1 :(得分:0)

评论header(),因此它只发回数据,而不是image/png

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

您的脚本包含

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

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

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

答案 5 :(得分:0)

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

enter image description here

答案 6 :(得分:0)

我希望这对于在Linux上对.Net Core应用程序进行故障排除的人可以节省一个小时: 就我而言,这实际上不是图像的问题。问题是服务器端的大写目录/文件名。在Windows文件系统上,文件名大小写无关紧要,而Linux FS区分大小写。

答案 7 :(得分:0)

这是a thread at support.mozilla.org的答案,可能会帮助遇到此问题的其他人:

我发现一个很常见的原因是图像类型与文件扩展名不匹配。这将导致Web服务器报告错误的mime类型。例如,如果您拍摄photoshop图像,将其重命名为.jpg文件,然后将其放置在网络服务器上,则它将不会在Firefox中加载。

如果您要解决此问题,请尝试下载文件并验证文件类型与jpg相匹配。今天,我为一个客户端修复了此问题,该客户端获取了.psd文件,将其重命名为.jpg,然后将其上传到了网络服务器,并想知道为什么它无法在Firefox中加载。

答案 8 :(得分:0)

就我而言,这是Visual Studio的错误原因。我开始通过img标签将图像添加到代码中,而VS则以我认为的智能感知指导了我。有趣的是,它走错了路。这就是给我的东西:

<img src="~/images/home-couple.jpg" />

应该在的位置:

<img src="images/home-couple.jpg" />

图像文件夹的位置位于wwwroot下。这是一个ASP.NET Core Web应用程序。