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);