我有一个制作图片的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")
,它会消除错误,但会向浏览器返回废话,如下所示:
(所有这些说,我对修复这个特定的图像文件不太感兴趣,而不是理解如何调试图像创建文件中的错误/意外行为。我想学习如何修复有问题的图像生成文件自己的。)
答案 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)
答案 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应用程序。