Предварительный просмотр фотографий с качеством PHP - PullRequest
0 голосов
/ 08 марта 2011

С помощью чего можно добиться такого же качества картинок, как при предпросмотре vkontakte.ru (не adv)?

Я использую библиотеку GD.

Качество изображения вконтакте:

enter image description here

Качественные картинки по моему сценарию:

enter image description here

Большое фото: Ссылка

На всей этой фотографии вконтакте с лучшим качеством весит 7Кб, а мои 16К ...

Мой скрипт:

<?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 ]

4 голосов
/ 08 марта 2011

Использование imagecopyresampled() вместо imagecopyresized() обычно решает острую проблему.

Тем не менее, сжатие JPG в GD невелико по любым меркам. Он не сравнится с превосходным экспортным фильтром Photoshop с точки зрения качества изображения и размера файла. ImageMagick имеет тенденцию быть хоть немного лучше - если хорошее сжатие очень важно, возможно, стоит посмотреть.

0 голосов
/ 08 марта 2011

@ Пекка верен, а что касается второго вопроса, вы можете использовать imagejpeg($img, $filename, $quality) для оптимизации миниатюры.

здесь - руководство и некоторые примеры, которые помогут вам с этим.

...