php imagecopyresampled низкое качество

У меня есть сценарий PHP, который сохраняет исходный образ, затем изменяет размер его - одна миниатюра и одно увеличенное изображение для веб-просмотра. Это работает хорошо кроме с некоторыми изображениями, качество ужасно. Это, кажется, сохраняется с очень низкой цветной панелью. Вы видите, что результат по http://kalpaitch.com/index.php?filter=white - нажимает на первую миниатюру с заголовком 'белый белый белый'

Ниже код, используемый для передискретизации изображения:

function resizeImg($name, $extension, $size1, $size2) {
if (preg_match('/jpg|jpeg|JPG|JPEG/',$extension)){
    $image = imagecreatefromjpeg($name);
}
if (preg_match('/gif|GIF/',$extension)){
    $image = imagecreatefromgif($name);
}

$old_width = imageSX($image);
$old_height = imageSY($image);
$old_aspect_ratio = $old_width/$old_height; 

if($size2 == 0){
    $new_aspect_ratio = $old_aspect_ratio;
    if($old_width > $old_height){
        $new_width = $size1;
        $new_height = $new_width / $old_aspect_ratio;
    } else {
        $new_height = $size1;
        $new_width = $new_height * $old_aspect_ratio;
    }
} elseif($size2 > 0){
    $new_aspect_ratio = $size1/$size2;
    //for landscape potographs
    if($old_aspect_ratio >= $new_aspect_ratio) {
        $x1 = round(($old_width - ($old_width * ($new_aspect_ratio/$old_aspect_ratio)))/2);
        $old_width = round($old_width * ($new_aspect_ratio/$old_aspect_ratio));
        $y1 = 0;
        $new_width = $size1;
        $new_height = $size2;
        //for portrait photographs
    } else{
        $x1 = 0;
        $y1 = 0;
        $old_height = round($old_width/$new_aspect_ratio);
        $new_width = $size1;
        $new_height = $size2;
    }
}

$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $image, 0, 0, $x1, $y1, $new_width, $new_height, $old_width, $old_height);

return $new_image;

Большое спасибо

P.S. [фотографии, удаленные из сервера]

И вот остальная часть кода загрузки:

// Move the original to the right place
        $result = @move_uploaded_file($image['tmp_name'], $origlocation);

        // Resize the image and save the thumbnail
        $new_image = resizeImg($origlocation, $extension, 500, 0);

        if (preg_match("/gif/",$extension)){
            imagegif($new_image, $normallocation); 
        } else {
            imagejpeg($new_image, $normallocation); 
        }

        // Resize the image and save the thumbnail
        $new_image = resizeImg($origlocation, $extension, 190, 120);

        if (preg_match("/gif/",$extension)){
            imagegif($new_image, $thumblocation); 
        } else { 
            imagejpeg($new_image, $thumblocation);
        }

11
задан kalpaitch 14 November 2013 в 21:58
поделиться

2 ответа

Потеря качества связана не с imagecopyresampled () , а с сжатием JPEG. К сожалению, алгоритмы сжатия GD не совпадают с алгоритмами Photoshop - на самом деле их очень мало. Но вы можете улучшить результат: уровень сжатия JPG GD по умолчанию составляет 75 из 100.

Вы можете повысить качество, используя третий параметр до imagejpeg () (который, я полагаю, вы используете для окончательного вывода ):

imagejpeg  ( $new_image, null, 99);

Поиграйте в диапазоне 90-100. Изображение станет больше по размеру файла, чем оригинал - это будет цена, которую вы заплатите. Но должно быть возможно достичь сопоставимого качества.

В качестве альтернативы, как уже сказал в комментариях Джон Химмельман, попробуйте использовать imagepng () для лучшего качества - также, конечно, за счет значительно большего размера файла.

24
ответ дан 3 December 2019 в 03:35
поделиться

Что ж, документация php.net говорит, что вам нужно иметь изображение imagecreatetruecolor () для вашего dest_image, если вы не хотите использовать только 255 цветную палитру, но вы уже это делаете.

Думаю, альтернативой было бы использование внешних инструментов, таких как imagemagick с вызовом system ().

1
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: