PHP的imagepng()方法保存了无效的图像

时间:2012-01-06 04:36:10

标签: php gd

我正在使用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)的示例:

âPNG

IHDRdaØMì∞

2 个答案:

答案 0 :(得分:7)

我发现了我的错误。 imagepng()的质量值范围为0到9,而imagejpeg()的取值范围为0到100,而imagegif()不接受任何此类参数。我试图保存质量为100的PNG。

所以,这是一个可爱的RTM案例。谢谢你的回复。

http://ca3.php.net/manual/en/function.imagepng.php

http://ca3.php.net/manual/en/function.imagejpeg.php

http://ca3.php.net/manual/en/function.imagegif.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;
    }
}