Боюсь, что Imagick может не поддерживать резкое изменение размера изображения. Даже самые лучшие фильтры дают размытые результаты, которые не соответствуют требованиям, даже ужасные, на мой взгляд.
Это лучшее качество, которое я могу получить от Imagick:
Это изменено с помощью TimThumbs:
Обратите внимание на резкую разницу в качестве? Кто-нибудь может привести пример четкого изображения, созданного Imagick?
Ниже приведен код Imagick, использованный для создания первого изображения:
function imgSize($imagePath,$imageName,$imageExt,$width,$height,$copy) {
$file = "img/".$imageName."-".$width."x".$height.".".$imageExt;
if (!file_exists($file)) {
try {
$image = $imagePath;
$im = new Imagick();
$im->pingImage($image);
$im->readImage($image);
$im->setImageFormat($imageExt);
//$im->thumbnailImage($width,$height,true);
$im->cropThumbnailImage($width,$height);
$im->resizeImage($width,$height,Imagick::FILTER_LANCZOS,0,false);
$im->cropThumbnailImage($width,$height);
if ($imageExt=("jpg"||"JPG")) {
$img->setComression(Imagick::COMPRESSION_JPEG);
$img->setComressionQuality(100);
}
if (!$copy==null) {
$draw = new ImagickDraw();
$draw->setFont("fpdf/font/Montserrat-Regular.ttf");
$draw->setFontSize(35);
$draw->setFillColor("Gray");
$draw->setFillAlpha(0.5);
$draw->setGravity(Imagick::INTERPOLATE_AVERAGE);
$im->annotateImage($draw,0,0,-45,$copy);
}
$im->writeImage("img/".$imageName."-".$width."x".$height.".".$imageExt);
$im->destroy();
return "img/".$imageName."-".$width."x".$height.".".$imageExt;
}
catch(Exception $e) { echo $e->getMessage(); }
}
};
Я знаю, что есть похожие вопросы, но не было достаточного ответа на эту проблему качества изображения. Большинство попыток решить проблемы с качеством изображения в Imagick сводятся к тому, чтобы «хорошо, что вы получаете, когда вы уменьшаете изображение». Но пример изображения TimThumbs, который я привел в этом посте, опровергает это предположение. Вы можете уменьшить изображение и получить потрясающие результаты, используя PHP.
Это кажется мне лучше, я просто изменил его размер на 20% от исходного изображения. Использование GD и 100% качества в качестве JPEG
function resizeImg($filename, $percent, $saveTo) {
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagejpeg($thumb, $saveTo, 100);
imagedestroy($thumb);
}
resizeImg('image.jpg', 0.2, 'image02.jpg');
Я скомпилировал расширение php55-imagick для проверки вашего кода, во-первых, вы ошиблись в названии 2 методов, когда исправлено, результирующее изображение на самом деле в порядке setCompression
не setComression
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
Вот изображение с правильными методами, как прокомментировал showdev, удвоив размер изображения (121K против 329K), но для меня это не сильно
$im->setImageCompression(Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(100);
Других решений пока нет …