PHP imagepng()正在创建损坏的图像

PHP imagepng()正在创建损坏的图像,php,image,png,Php,Image,Png,我到处寻找我的问题的可能解决办法。不幸的是,我似乎无法理解。我有一个.php文件,它基于其他图像创建一个图像。我让脚本完全按照现在的样子工作,没有瑕疵。但在摆弄了一些其他文件后,它突然停止工作,并在Firefox、Chrome和IE上生成了损坏的.png图像 image.php <?php ini_set("display_errors", 1); ini_set("error_reporting", 2047); ini_set("display_errors", 1); ini_set

我到处寻找我的问题的可能解决办法。不幸的是,我似乎无法理解。我有一个.php文件,它基于其他图像创建一个图像。我让脚本完全按照现在的样子工作,没有瑕疵。但在摆弄了一些其他文件后,它突然停止工作,并在Firefox、Chrome和IE上生成了损坏的.png图像

image.php

<?php
ini_set("display_errors", 1);
ini_set("error_reporting", 2047);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);
error_reporting("E_ALL");

include("GameEngine/Database.php");
if(isset($_GET['uid'])){
    $uid =  $_GET['uid'];
} else {
    $uid = "1";
}
if(isset($_GET['size'])){
    if($_GET['size']=='profile'){
        $size =  '31x40';
    }elseif($_GET['size']=='inventory'){
        $size =  '64x82';
    }elseif($_GET['size']=='sideinfo'){
        $size =  '119x136';
    }
} else {
    $size = "119x136";
}
$herodetail = $database->HeroFace($uid);
if($herodetail['color']==0){
    $color = "black";
}
if($herodetail['color']==1){
    $color = "brown";
}
if($herodetail['color']==2){
    $color = "darkbrown";
}
if($herodetail['color']==3){
    $color = "yellow";
}
if($herodetail['color']==4){
    $color = "red";
}
$geteye = $herodetail['eye'];
$geteyebrow = $herodetail['eyebrow'];
$getnose = $herodetail['nose'];
$getear = $herodetail['ear'];
$getmouth = $herodetail['mouth'];
$getbeard = $herodetail['beard'];
$gethair = $herodetail['hair'];
$getface = $herodetail['face'];

// USAGE EXAMPLE: 
$body = imagecreatefrompng('img/hero/head/'.$size.'/face0.png');
if($getbeard!=5){
    $beard = imagecreatefrompng('img/hero/head/'.$size.'/beard/beard'.$getbeard.'-'.$color.'.png');
}
$ear = imagecreatefrompng('img/hero/head/'.$size.'/ear/ear'.$getear.'.png');
$eye = imagecreatefrompng('img/hero/head/'.$size.'/eye/eye'.$geteye.'.png');
$eyebrow = imagecreatefrompng('img/hero/head/'.$size.'/eyebrow/eyebrow'.$geteyebrow.'-'.$color.'.png');
if($gethair!=5){
    $hair = imagecreatefrompng('img/hero/head/'.$size.'/hair/hair'.$gethair.'-'.$color.'.png');
}
$mouth = imagecreatefrompng('img/hero/head/'.$size.'/mouth/mouth'.$getmouth.'.png');
$nose = imagecreatefrompng('img/hero/head/'.$size.'/nose/nose'.$getnose.'.png');
$face = imagecreatefrompng('img/hero/head/'.$size.'/face/face'.$getface.'.png');

// SAME COMMANDS: 
$database->imagecopymerge_alpha($body, $face, 0, 0, 0, 0, imagesx($face), imagesy($face),100); 
$database->imagecopymerge_alpha($body, $ear, 0, 0, 0, 0, imagesx($ear), imagesy($ear),100);
$database->imagecopymerge_alpha($body, $eye, 0, 0, 0, 0, imagesx($eye), imagesy($eye),100);
$database->imagecopymerge_alpha($body, $eyebrow, 0, 0, 0, 0, imagesx($eyebrow), imagesy($eyebrow),100);
if($gethair!=5){
$database->imagecopymerge_alpha($body, $hair, 0, 0, 0, 0, imagesx($hair), imagesy($hair),100);
}
$database->imagecopymerge_alpha($body, $mouth, 0, 0, 0, 0, imagesx($mouth), imagesy($mouth),100);
$database->imagecopymerge_alpha($body, $nose, 0, 0, 0, 0, imagesx($nose), imagesy($nose),100);
if($getbeard!=5){
$database->imagecopymerge_alpha($body, $beard, 0, 0, 0, 0, imagesx($beard), imagesy($beard),100);
}

// OUTPUT IMAGE: 
header("Content-Type: image/png"); 
imagesavealpha($body, true); 
imagepng($body, NULL);
?>

我已经尝试注释掉header(),以便在渲染图像之前检查任何PHP中是否存在错误。事实并非如此。我尝试了标记中的所有$变量,以检查这些变量是否正确呈现。他们做到了。我不知道问题出在哪里

我现在唯一的猜测是,有一个空格或回车符不知何故被添加到最终渲染中,导致它损坏。然而,我已经搜索这个可能的空白很久了,似乎找不到它

非常感谢您的任何提示和/或建议

已解决 此脚本包含的其中一个文件已与BOM一起保存为UTF-8。这给了图像一个额外的字节,使其损坏。将所有文件保存为UTF-8而不使用BOM修复了我的问题。

我看不到问题(除非出现一些错误报告?),但如果您将浏览器中的图像保存到一个文件,然后在文本编辑器中打开,问题可能会很明显


编辑:它原来是utf-8文件中的字节顺序标记。

只是碰巧搜索了一下,找到了:100%相同。。。确实没有弄乱数据库中的某些内容。php?

保存图像并将其加载到.txt编辑器会产生一大堆奇怪的ASCII字符,正常图像文件应该加载这些字符。然而,第一行是:�PNG这个ASCII字符应该在PNG前面吗?不。我猜它是utf-8文件的字节顺序标记。将文件另存为其他编码或不带BOM的utf-8。在我了解发生了什么之前,我还从BOM中发现了不少灰色头发。image.php文件已经保存为UTF-8,没有BOM。图像文件仅作为标题内容类型创建:image/png。在任何情况下:我只是将image.php文件保存为Cp1252,仍然得到相同的结果(损坏的图像)。检查一个已知良好的png,我必须承认,我错了。在“PNG”之前有两个字节……我刚刚发现其中一个包含的.php文件更改为带有BOM的UTF-8。然而,试图在Zend中将其更改为Cp1252似乎并没有删除BOM?(它仍然给我以下信息:字节顺序标记是UTF-8(BOM))。关于如何改变这一点有什么想法吗?感谢您的回复,但是db_MYSQL.php被保存为UTF-8并带有BOM.close ough tho;)似乎是个问题。我看你在这里有好朋友。祝你好运