Question

I got following code for generate a image thumbnail, but it only works for JPEG for unknown reason, i cant figure out why it doesnt work for PNG ?

function generate_image_thumbnail($source_image_path, $thumbnail_image_path)
    {
        list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
        switch ($source_image_type) {
            case IMAGETYPE_GIF:
                $source_gd_image = imagecreatefromgif($source_image_path);
                break;
            case IMAGETYPE_JPEG:
                $source_gd_image = imagecreatefromjpeg($source_image_path);
                break;
            case IMAGETYPE_PNG:{
                $source_gd_image = imagecreatefrompng($source_image_path);
                break;
            }
        } //$source_image_type
        if ($source_gd_image === false) {
            return false;
        } //$source_gd_image === false
        $source_aspect_ratio    = $source_image_width / $source_image_height;
        $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT;
        if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) {
            $thumbnail_image_width  = $source_image_width;
            $thumbnail_image_height = $source_image_height;
        } //$source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT
        elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
            $thumbnail_image_width  = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio);
            $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT;
        } //$thumbnail_aspect_ratio > $source_aspect_ratio
        else {
            $thumbnail_image_width  = THUMBNAIL_IMAGE_MAX_WIDTH;
            $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio);
        }
        $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
        imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);

        switch ($source_image_type) {
            case IMAGETYPE_GIF:
                imagegif($thumbnail_gd_image, $thumbnail_image_path, 90);
                break;
            case IMAGETYPE_JPEG:
                imagejpeg($thumbnail_gd_image, $thumbnail_image_path, 90);
                break;
            case IMAGETYPE_PNG:{
                //imagealphablending($thumbnail_gd_image, false); 
                //imagesavealpha($thumbnail_gd_image,true);
                imagepng($thumbnail_gd_image, $thumbnail_image_path, 90);
                break;
            }
        }               



        imagedestroy($source_gd_image);
        imagedestroy($thumbnail_gd_image);
        return true;
    }
Was it helpful?

Solution

the problem is in the second png case, exactly in

imagepng($thumbnail_gd_image, $thumbnail_image_path, 90);

according to imagepng function

quality

Compression level: from 0 (no compression) to 9.

so, change 90 to 9 (for example)

imagepng($thumbnail_gd_image, $thumbnail_image_path, 9);

OTHER TIPS

imagepng($thumbnail_gd_image, $thumbnail_image_path, 90);

shall be

imagepng($thumbnail_gd_image, $thumbnail_image_path, 9);

You probably got it working. But I would like to recommend the php library imagemagick. If you have access to it on your webhost, it's very good library when working with images. You can download the library to use it locally as well.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top