【发布时间】:2016-03-28 16:13:42
【问题描述】:
使用 PHP 的 Imagick 库,我正在拍摄图像、调整大小、裁剪并在顶部设置叠加层。这很好用,但对于具有文本或细/复杂线条的图像,结果非常参差不齐。
我将输出质量设置为 90,所以这不应该是问题。在调整大小/裁剪等期间我做错了什么吗?
链接如下:
http://www.tiltworld.co.uk/resize.php
http://www.tiltworld.co.uk/output.jpg
如您所见,输出的图像质量非常差,文字和线条、锯齿状或难以看到/阅读。
这是调整大小之前的原始全尺寸:
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);
}
}
【问题讨论】: