webcoderpro
@webcoderpro
PHP-программист

Почему при ресайзе изображений качество теряется?

Функция работает, но фотографий не качественно получается, мутными становится. Как сделать точно как в оригинале?
function resize($target, $dest, $wmax, $hmax, $ext){
    /*
    $target - путь к оригинальному файлу
    $dest - путь сохранения обработанного файла
    $wmax - максимальная ширина
    $hmax - максимальная высота
    $ext - расширение файла
    */
    list($w_orig, $h_orig) = getimagesize($target);
    $ratio = $w_orig / $h_orig; // =1 - квадрат, <1 - альбомная, >1 - книжная

    if(($wmax / $hmax) > $ratio){
        $wmax = $hmax * $ratio;
    }else{
        $hmax = $wmax / $ratio;
    }
    
    $img = "";
    // imagecreatefromjpeg | imagecreatefromgif | imagecreatefrompng
    switch($ext){
        case("gif"):
            $img = imagecreatefromgif($target);
            break;
        case("png"):
            $img = imagecreatefrompng($target);
            break;
        default:
            $img = imagecreatefromjpeg($target);    
    }
    $newImg = imagecreatetruecolor($wmax, $hmax); // создаем оболочку для новой картинки
    
    if($ext == "png"){
        imagesavealpha($newImg, true); // сохранение альфа канала
        $transPng = imagecolorallocatealpha($newImg,0,0,0,127); // добавляем прозрачность
        imagefill($newImg, 0, 0, $transPng); // заливка  
    }
    
    imagecopyresampled($newImg, $img, 0, 0, 0, 0, $wmax, $hmax, $w_orig, $h_orig); // копируем и ресайзим изображение
    switch($ext){
        case("gif"):
            imagegif($newImg, $dest);
            break;
        case("png"):
            imagepng($newImg, $dest);
            break;
        default:
            imagejpeg($newImg, $dest, 85);    
    }
    imagedestroy($newImg);
}
  • Вопрос задан
  • 566 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Silm
1. Качество будет неизбежно падать при повторном сохранении изображений в форматах сжатия с потерями (усиливаются артефакты).
2. При ресайзе на величины не кратные двум, изображение всегда будет становится немного замыленным. (алгоритму приходится "додумывать" пиксели по соседям).

А вообще вам бы стоило дать ссылки на изображения "до/после".

PS
Рекомендую не мучатся, а использовать библиотеки, типа image.intervention.io
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы