I have a PHP file that creates an image. I have PHP configured to report errors on the screen. When I run the file in a php file in Firefox 23, it returns the Image cannot be displayed because it contains errors
.
How to find out which specific error is to blame for the image?
Additional Information Here is the code
<?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']); */ ?>
If I comment on header("content-type: image/png")
, it will get rid of the error, but will return stupidity to the browser, which looks like this:

(All of this suggests that I am less interested in fixing this image file than in understanding how to go about debugging errors / unexpected behavior in image creation files. I want to learn how to fix problematic image generating files on my own .)