2011-08-06 68 views
-1

我试图采取一个图片(.gif,.jpg或.png),并且将其输出为.png为什么PHP渲染这个图像不正确?

这是代码使用:

<?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(); 
?> 

问题是,当我输入此,例如: http://i52.tinypic.com/dzglmu.png

输出变成这样: http://i53.tinypic.com/15fg8w5.png

谁能告诉我怎么回事错在这里?

+0

第二个链接对我说'The Image“http://i53.tinypic.com/15fg8w5.png”无法显示,因为它包含错误。“这是你想表现的吗? – Nobody

+0

在我的浏览器中显示:https://img.skitch.com/20110806-xtth8ysmgc2835t81dj75b7xxa.jpg(这是一张图片截图) – ONOZ

+0

首先清理上传的图片数据,不要依赖mime/type报告由浏览器。这些信息可能是错误的,然后您使用了错误的功能。 – hakre

回答

2

好吧,这不是那么容易。 PNG和GIF携带关于alpha级别的信息,这些信息可能会丢失(并因此呈现另一种颜色)。另外,正如@hakre所说,浏览器提供的MIME类型不是一个真正可靠的信息。而且你的MIME还没有完成,因为还有其他的可能性:例如,我在IE8上遇到了一些麻烦,因为它指定了MIME'image/x-png'而不是通常的'image/png',而且很容易打破你的功能。 (!和evaluting如果图像是一个真正的形象,这是做了重要的一步) 获得MIME的一个很好的可靠的方法是使用getimagesize()功能

$size = getimagesize($file); 
$mime = $size['mime']; 

getimagesize()返回一个4个指标,比如一个数组:

  1. 0索引是以像素为单位的图像宽度。
  2. 1索引是以像素为单位的图像高度。
  3. 的2索引是图像类型的标志:

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

  4. 3索引中包含 'HEIGHT = “YYY” WIDTH = “XXX”'

我把前面总结的手册页我联系,但你可以很容易地测试它自己,我只是懒惰。

你需要那么至少为PNG格式添加:

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

但寻找更完整的例子在the manual或谷歌为它,因为这些只是建议,你需要适应形势在何种程度上你需要对待你的形象。