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

Есть функция PHP, которая изменяет размер картинки до заданных параметров (ширина, высота, качество).

function image_resize(
    $source_path,
    $destination_path,
    $newwidth,
    $newheight = FALSE,
    $quality = FALSE // качество для формата jpeg
    ) {

    ini_set("gd.jpeg_ignore_warning", 1); // иначе на некотоых jpeg-файлах не работает
   
    list($oldwidth, $oldheight, $type) = getimagesize($source_path);
   
    switch ($type) {
        case IMAGETYPE_JPEG: $typestr = 'jpeg'; break;
        case IMAGETYPE_GIF: $typestr = 'gif' ;break;
        case IMAGETYPE_PNG: $typestr = 'png'; break;
    }
    $function = "imagecreatefrom$typestr";
    $src_resource = $function($source_path);
   
    if (!$newheight) { $newheight = round($newwidth * $oldheight/$oldwidth); }
    elseif (!$newwidth) { $newwidth = round($newheight * $oldwidth/$oldheight); }
    $destination_resource = imagecreatetruecolor($newwidth,$newheight);
   
    imagecopyresampled($destination_resource, $src_resource, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight);
   
    if ($type = 2) { # jpeg
        imageinterlace($destination_resource, 1); // чересстрочное формирование изображение
        imagejpeg($destination_resource, $destination_path, $quality);     
    }
    else { # gif, png
        $function = "image$typestr";
        $function($destination_resource, $destination_path);
    }
   
    imagedestroy($destination_resource);
    imagedestroy($src_resource);
}


//image_resize(исходник, конечник, высота, ширина, качество);
image_resize('img/products/temp/'.$imgName, 'img/products/300x300/'.$imgName, 300, 300, 100);

Подскажите пожалуйста, почему при выставленном качестве 100% обрезанная картинка всё равно мутноватая (т.е. не качественная) ??? Что нужно сделать, чтобы новая обрезаемая картинка не теряла качество???


Ответы (1 шт):

Автор решения: Tunker

функция imagejpeg:

quality - Необязательный параметр, и может принимать значения в диапазоне от 0 (низкое качество, маленький размер файла) до 100 (высокое качество, большой размер файла). По умолчанию (-1) используется качество IJG (около 75).

у Вас $quality = FALSE т.е. скорее всего воспринимается как 0 - низкое качество, попробуйте поменять этот параметр на 100, т.е.:

$quality = 100;

Либо вообще убрать этот параметр, тогда будет качество 75 (по умолчанию)

→ Ссылка