Frage

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;
    }
War es hilfreich?

Lösung

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

Andere Tipps

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top