PHP Imagick - 调整大小后文本和线条不是 clear/smooth
PHP Imagick - Text and Lines not clear/smooth after resize
我正在使用 PHP 的 Imagick 库拍摄图像、调整大小、裁剪并在顶部设置叠加层。这工作正常,但对于具有文本或 thin/intricate 行的图像,结果非常参差不齐。
我将输出质量设置为 90,所以这应该不是问题。在 resize/crop 等期间我做错了什么吗?
Link如下所示:
http://www.tiltworld.co.uk/resize.php
http://www.tiltworld.co.uk/output.jpg
如您所见,输出的图像质量非常差,有文字和线条,锯齿状或难以see/read。
这是调整大小前的原始完整尺寸:
http://www.tiltworld.co.uk/test.jpg
我的PHP代码是:
第一步:设置图片
$overlay = new Imagick('http://www.tiltworld.co.uk/overlay.png');
$img = new Imagick('http://www.tiltworld.co.uk/test.jpg');
$img_d = $img->getImageGeometry();
$img_w = $img_d['width'];
$img_h = $img_d['height'];
第 2 步:调整图像大小
// resize
$crop_w = round(260 * 0.53);
$crop_h = round(260 * 0.53);
list($_w, $_h) = scaleProportions($crop_w, $crop_h, $img_w, $img_h);
$img->adaptiveResizeImage($_w, $_h);
第 3 步:裁剪图像
// crop
$new_d = $img->getImageGeometry();
$new_w = $new_d['width'];
$new_h = $new_d['height'];
$crop_x = ($new_w - $crop_w) / 2;
$crop_y = ($new_h - $crop_h) / 2;
$img->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
第 4 步:将图像置于中心
// place
$img->setImageFormat('png');
$img->setImageBackgroundColor(new ImagickPixel('white'));
$place_x = -(260 - $crop_w) / 2;
$place_y = -(260 - $crop_h) / 2;
$img->extentImage(260, 260, $place_x, $place_y);
第 5 步:合并图像和叠加层
// merge
$img->compositeImage($overlay, imagick::COMPOSITE_ATOP, 0, 0);
第六步:输出图像
// output
header("Content-Type: image/jpg");
$img->setImageFormat('jpg');
$img->setImageCompression(Imagick::COMPRESSION_JPEG);
$img->setImageCompressionQuality(90);
echo $img->getImageBlob();
(调整大小时使用的缩放函数)
function scaleProportions($mw, $mh, $cw, $ch)
{
$scale = $mh / $ch;
$ch = $mh;
$cw = $cw * $scale;
if($cw>=$mw){
if($ch>=$mh)
{
return array($cw, $ch);
}
else
{
$scale = $mw / $cw;
$cw = $mw;
$ch = $ch * $scale;
return array($cw, $ch);
}
}
else
{
$scale = $mw / $cw;
$cw = $mw;
$ch = $ch * $scale;
return array($cw, $ch);
}
}
您使用了一种奇怪的调整大小方法。尝试使用允许您控制过滤方式的选项:
$imagick->resizeImage($width, $height, \Imagick::FILTER_LANCZOS, 1, false);
我正在使用 PHP 的 Imagick 库拍摄图像、调整大小、裁剪并在顶部设置叠加层。这工作正常,但对于具有文本或 thin/intricate 行的图像,结果非常参差不齐。
我将输出质量设置为 90,所以这应该不是问题。在 resize/crop 等期间我做错了什么吗?
Link如下所示:
http://www.tiltworld.co.uk/resize.php
http://www.tiltworld.co.uk/output.jpg
如您所见,输出的图像质量非常差,有文字和线条,锯齿状或难以see/read。
这是调整大小前的原始完整尺寸:
http://www.tiltworld.co.uk/test.jpg
我的PHP代码是:
第一步:设置图片
$overlay = new Imagick('http://www.tiltworld.co.uk/overlay.png');
$img = new Imagick('http://www.tiltworld.co.uk/test.jpg');
$img_d = $img->getImageGeometry();
$img_w = $img_d['width'];
$img_h = $img_d['height'];
第 2 步:调整图像大小
// resize
$crop_w = round(260 * 0.53);
$crop_h = round(260 * 0.53);
list($_w, $_h) = scaleProportions($crop_w, $crop_h, $img_w, $img_h);
$img->adaptiveResizeImage($_w, $_h);
第 3 步:裁剪图像
// crop
$new_d = $img->getImageGeometry();
$new_w = $new_d['width'];
$new_h = $new_d['height'];
$crop_x = ($new_w - $crop_w) / 2;
$crop_y = ($new_h - $crop_h) / 2;
$img->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
第 4 步:将图像置于中心
// place
$img->setImageFormat('png');
$img->setImageBackgroundColor(new ImagickPixel('white'));
$place_x = -(260 - $crop_w) / 2;
$place_y = -(260 - $crop_h) / 2;
$img->extentImage(260, 260, $place_x, $place_y);
第 5 步:合并图像和叠加层
// merge
$img->compositeImage($overlay, imagick::COMPOSITE_ATOP, 0, 0);
第六步:输出图像
// output
header("Content-Type: image/jpg");
$img->setImageFormat('jpg');
$img->setImageCompression(Imagick::COMPRESSION_JPEG);
$img->setImageCompressionQuality(90);
echo $img->getImageBlob();
(调整大小时使用的缩放函数)
function scaleProportions($mw, $mh, $cw, $ch)
{
$scale = $mh / $ch;
$ch = $mh;
$cw = $cw * $scale;
if($cw>=$mw){
if($ch>=$mh)
{
return array($cw, $ch);
}
else
{
$scale = $mw / $cw;
$cw = $mw;
$ch = $ch * $scale;
return array($cw, $ch);
}
}
else
{
$scale = $mw / $cw;
$cw = $mw;
$ch = $ch * $scale;
return array($cw, $ch);
}
}
您使用了一种奇怪的调整大小方法。尝试使用允许您控制过滤方式的选项:
$imagick->resizeImage($width, $height, \Imagick::FILTER_LANCZOS, 1, false);