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

I am using the GD library to automatically generate a thumbnail version of an uploaded image. I call the appropriate image____() function to save in the same format as the original. My code works fine for JPEG and GIF, but if I upload a PNG file, the resulting thumbnail is invalid. It actually only contains 33 bytes (with any source PNG that I've tried so far). This image does not display in the browser, nor can it be opened by Preview (on MacOS).

I use imagecreatetruecolor() along with imagecopyresampled() to generate the thumbnail, like this:

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;
}

Below is the version info of my setup (It's MAMP Version 1.9.4)

PHP Version 5.3.2 GD Version bundled (2.0.34 compatible)

Here is an example of an invalid generated thumbnail image (PNG):

âPNG

IHDRdaØMì∞

I found my error. imagepng() takes a quality value range of 0 to 9, while imagejpeg() takes a range of 0 to 100 and imagegif() doesn't take any such parameter. I was trying to save a PNG with a quality of 100.

So, this is a lovely case of RTM. Thanks for your responses.

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

Try this function.

/** 
* 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;
    }
}