为什么PHP呈现此图像不正确?

为什么PHP呈现此图像不正确?,php,png,gd,Php,Png,Gd,我尝试拍摄图像(.gif、.jpg或.png),并将其输出为.png 这是我使用的代码: <?php $filename = urlencode($_FILES['uploadfile']['name']); $size = getimagesize($tempname); switch($size["mime"]){ case "image/jpeg": $img = imagecreatefromjpeg($tempname); //jpeg file

我尝试拍摄图像(.gif、.jpg或.png),并将其输出为.png

这是我使用的代码:

<?php
$filename = urlencode($_FILES['uploadfile']['name']);

$size = getimagesize($tempname);

switch($size["mime"]){

    case "image/jpeg":
        $img = imagecreatefromjpeg($tempname); //jpeg file
    break;

    case "image/gif":
        $img = imagecreatefromgif($tempname); //gif file
    break;

    case "image/png":   
        $img = imagecreatefrompng($tempname); //png file
    break;

    default: 
        die('Unknown filetype');
    break;
}

ob_start();
imagepng($img);
$content = ob_get_contents();
ob_end_clean();
?>

问题是当我输入这个时,例如:

输出如下:


有人能告诉我这里出了什么问题吗?

嗯,其实没那么容易。PNG和GIF包含有关alpha级别的信息,这些信息可能会丢失(从而以另一种颜色呈现)。另外,正如@hakre所说,浏览器提供的mime类型并不是一个真正可靠的信息。您的MIME不完整,因为还有其他可能:例如,我在IE8上遇到了一些问题,因为它将MIME指定为“image/x-png”,而不是通常的“image/png”,这很容易破坏您的功能。 获取MIME的一个很好的可靠方法(以及评估图像是否真的是图像,这是一个重要的步骤!)是使用函数

getimagesize()
返回一个包含4个索引的数组,即:

  • 0索引是图像的宽度(以像素为单位)
  • 1索引是以像素为单位的图像高度
  • 2索引是图像类型的标志:

    1=GIF,2=JPG,3=PNG,4=SWF,5=PSD,6=BMP,7=TIFF(orden de字节英特尔),8=TIFF(摩托罗拉),9=JPC,10=JP2, 11=JPX,12=JB2,13=SWC,14=IFF,15=WBMP,16=XBM

  • 3索引包含“height=“yyy”width=“xxx””

  • 我从我链接的手册页面上获取了上述总结,但你可以自己轻松地测试它,我只是在偷懒

    然后,您至少需要为PNG添加:

    imagealphablending($img, true); // setting alpha blending on
    imagesavealpha($img, true); // save alphablending setting 
    

    但是,请在上或谷歌上查找更完整的示例,因为这些只是建议,您需要适应您需要处理图像的程度。

    第二个链接对我说
    图像”http://i53.tinypic.com/15fg8w5.png无法显示,因为它包含错误。
    。这就是你想要显示的吗?在我的浏览器中,它显示了:(这是图像的屏幕截图)首先清理上传的图像数据,不要依赖浏览器报告的mime/类型。此信息可能是错误的,然后使用错误的功能。
    imagealphablending($img, true); // setting alpha blending on
    imagesavealpha($img, true); // save alphablending setting