我正在使用GD库自动生成上传图像的缩略图版本。我调用相应的image____()
函数以与原始格式相同的格式保存。我的代码适用于JPEG和GIF,但如果我上传PNG文件,则生成的缩略图无效。它实际上只包含33个字节(到目前为止我已尝试过任何源PNG)。此图像不会显示在浏览器中,也不能通过预览(在MacOS上)打开。
我使用 imagecreatetruecolor ()和 imagecopyresampled ()生成缩略图,如下所示:
function _resizeImageToFit($resource, $size)
{
$sourceWidth = imagesx($resource);
$sourceHeight = imagesy($resource);
if($sourceWidth >= $sourceHeight) {
// landscape or square
$newHeight = 1.0*$size/$sourceWidth*$sourceHeight;
$newWidth = $size;
}
else {
// portrait
$newWidth = 1.0*$size/$sourceHeight*$sourceWidth;
$newHeight = $size;
}
$thmb = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($thmb, $resource, 0, 0, 0, 0, $newWidth, $newHeight, $sourceWidth, $sourceHeight);
return $thmb;
}
以下是我的设置的版本信息(它是MAMP版本1.9.4)
PHP版本5.3.2 捆绑的GD版本(2.0.34兼容)
以下是无效生成的缩略图(PNG)的示例:
âPNGIHDRdaØMì∞
答案 0 :(得分:7)
我发现了我的错误。 imagepng()的质量值范围为0到9,而imagejpeg()的取值范围为0到100,而imagegif()不接受任何此类参数。我试图保存质量为100的PNG。
所以,这是一个可爱的RTM案例。谢谢你的回复。
http://ca3.php.net/manual/en/function.imagepng.php
答案 1 :(得分:0)
尝试此功能。
/**
* Crop new images using the source image
*
* @param string $source - Image source
* @param string $destination - Image destination
* @param integer $thumbW - Width for the new image
* @param integer $thumbH - Height for the new image
* @param string $imageType - Type of the image
*
* @return bool
*/
function cropImage($source, $destination, $thumbW, $thumbH, $imageType)
{
list($width, $height, $type, $attr) = getimagesize($source);
$x = 0;
$y = 0;
if ($width*$thumbH>$height*$thumbW) {
$x = ceil(($width - $height*$thumbW/$thumbH)/2);
$width = $height*$thumbW/$thumbH;
} else {
$y = ceil(($height - $width*$thumbH/$thumbW)/2);
$height = $width*$thumbH/$thumbW;
}
$newImage = imagecreatetruecolor($thumbW, $thumbH) or die ('Can not use GD');
/*
if ($extension=='jpg' || $extension=='jpeg') {
$image = imagecreatefromjpeg($source);
} else if ($extension=='gif') {
$image = imagecreatefromgif($source);
} else if ($extension=='png') {
$image = imagecreatefrompng($source);
}
*/
switch($imageType) {
case "image/gif":
$image = imagecreatefromgif($source);
break;
case "image/pjpeg":
case "image/jpeg":
case "image/jpg":
$image = imagecreatefromjpeg($source);
break;
case "image/png":
case "image/x-png":
$image = imagecreatefrompng($source);
break;
}
if (!@imagecopyresampled($newImage, $image, 0, 0, $x, $y, $thumbW, $thumbH, $width, $height)) {
return false;
} else {
imagejpeg($newImage, $destination,100);
imagedestroy($image);
return true;
}
}