PHP质量预览照片

时间:2011-03-08 13:37:53

标签: php gd preview

借助与预览vkontakte.ru(不是adv)相同质量的图片可以实现的帮助?

我使用的是GD。

图像质量vkontakte:

enter image description here

我的剧本的优质图片:

enter image description here

大照片:Link

在所有这张照片中,质量最好的vkontakte重7Kb,而我的16K ......

我的剧本:

<?php
    function _makeThumbnail($image, $dest, $ext)
    {
        $imageType = exif_imagetype($image);

        switch ($imageType)
        {
            case IMAGETYPE_JPEG:
                $img = imagecreatefromjpeg($image);
                break;
            case IMAGETYPE_PNG:
                $img = imagecreatefrompng($image);
                break;
            case IMAGETYPE_GIF:
                $img = imagecreatefromgif($image);
                break;
            default:
                throw new Exception('Bad extension');
        }

        $width  = imagesx($img);
        $height = imagesy($img);

            list($widthX, $heightX) = array('130', '130');

            if ($width > $widthX || $height > $heightX)
            {        
                if ($height > $width) 
                {
                    $ratio = $heightX / $height;  
                    $newHeight = $heightX;
                    $newWidth = $width * $ratio; 
                }
                else
                {
                    $ratio = $widthX / $width;   
                    $newWidth = $widthX;  
                    $newHeight = $height * $ratio;   
                }

                $previewImg = imagecreatetruecolor($newWidth, $newHeight); 

                $palsize = ImageColorsTotal($img); 
                for ($i = 0; $i < $palsize; $i++) 
                { 
                    $colors = ImageColorsForIndex($img, $i);   
                    ImageColorAllocate($previewImg, $colors['red'], $colors['green'], $colors['blue']);
                } 

                imagecopyresized($previewImg, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

                $name = $dest;
                switch ($imageType)
                {
                    case IMAGETYPE_JPEG:
                        imagejpeg($previewImg, $name . '.' . $ext, 100);
                        break;
                    case IMAGETYPE_PNG:
                        imagesavealpha($previewImg, true);
                        imagepng($previewImg, $name . '.' . $ext, 9);
                    case IMAGETYPE_GIF:
                        imagegif($previewImg, $name . '.' . $ext);
                        break;
                    default:
                        throw new Exception();
                }
            }
        imagedestroy($previewImg);
        imagedestroy($img);
    }

实际上有必要解决两个问题。 提高质量,从而减小预览的大小。

2 个答案:

答案 0 :(得分:4)

使用imagecopyresampled()代替imagecopyresized()通常可以解决严重问题。

也就是说,根据任何标准,GD的JPG压缩都不是很好。在图像质量与文件大小方面,它远不及Photoshop出色的导出过滤器。 ImageMagick往往会略微好一点 - 如果良好的压缩非常重要,那么可能值得一看。

答案 1 :(得分:0)

@Pekka是正确的,至于第二个问题,您可以使用imagejpeg($img, $filename, $quality)来优化缩略图。

here是一个指南和一些示例,以帮助您解决这个问题。