如何使使用 Imagick::resizeImage 的缩略图看起来更清晰 - PHP?

How to make thumbnails using Imagick::resizeImage appear sharper - PHP?

我正在使用 Imagick::resizeImage 为 pdf 文件的每一页创建缩略​​图 PNG 图像。但是,我得到的图像真的很模糊。我怎样才能让它更锐利一点?任何指针将不胜感激。

我试过在 0.1 - 1 之间调整 Imagick::resizeImage 的 'blur' 参数,但没有成功。

$pdfPage = '1Mpublic.pdf[0]';
$im = new imagick($pdfPage);
$im->setImageFormat('png');

// Resize thumbnail image
$imgHeight =  $im -> getImageHeight();
$imgWidth = $im -> getImageWidth();
$desiredWidth = 200;
$desiredHeight = resizedImageHeight($imgWidth, $imgHeight, $desiredWidth);

$im -> setResolution(1500, 1500);
$im -> resizeImage($desiredWidth, $desiredHeight, imagick::STYLE_NORMAL, 0.1);

 /* Resize image */
function resizedImageHeight($imgWidth, $imgHeight, $desiredImgWidth){

    $quoient = $imgWidth/$imgHeight;
    $height = $desiredImgWidth/$quoient;

    return $height;
}

原始 pdf link:

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4905263/pdf/ksgt-06-04-1091539.pdf

不幸的是,我不太了解 Imagick。但在 Imagemagick 命令行中,我会执行有时称为超级采样的操作。即使用大密度读取PDF,然后按逆比例因子缩小。

例如,标称密度为 72 dpi。我会以 4*72=288 dpi 阅读输入的 PDF。然后在光栅化之后,我会调整 1/4=25% 的大小,或者为了获得大于 25% 的更大结果,比如 50%。这是您以两种方式完成的第一页:

convert -density 288 ksgt-06-04-1091539.pdf[0] -resize 25% result1.png

convert -density 288 ksgt-06-04-1091539.pdf[0] -resize 50% result2.png

在 Imagick 中,密钥类似于:

$imagick = new Imagick(); 
$imagick->setImageResolution(288, 288);
$imagick->readImage('myfile.pdf'); 

与其先渲染然后调整光栅大小,不如先将 PDF 渲染到正确的像素数。它会更快,并且您可以确定内容的清晰度是正确的。

例如:

$ time convert -density 50 ksgt-06-04-1091539.pdf[0] x2.png
real    0m0.325s
user    0m0.299s
sys 0m0.024s

品牌:

-density 50 生成的页面像素数与您的示例大致相同,为 425。

在 imagick 中你可以这样做(@fmw42 的优秀回答已经说过):

#!/usr/bin/env php
<?php

$target_width = 400;

# get natural size, calculate density we need for target width
$im = new imagick();
$im->pingImage($argv[1]);
$geo = $im->getImageGeometry();
$natural_width = $geo['width'];
$density = 72.0 * $target_width / $natural_width;

# load at correct resolution for target_width
$im = new imagick();
$im->setResolution($density, $density);
$im->readImage($argv[1]);

# and write back
$im->writeImage($argv[2]);

不幸的是,在 imagick 中执行 ping 和读取操作有点慢:

$ time ./pdfthumb.php ksgt-06-04-1091539.pdf x.png
real    0m2.773s
user    0m2.737s
sys 0m0.036s

这不是 imagick,但是 vipsthumbnail 可以在一次操作中执行 ping 和 read:

$ time vipsthumbnail ksgt-06-04-1091539.pdf -s 400x -o x2.png
real    0m0.064s
user    0m0.064s
sys 0m0.011s

如果速度很重要,可能值得考虑。 libvips has a php binding 所以你可以直接调用它,但如果你这样做,你会 运行 陷入可怕的许可问题,因为它使用 GPL 库 poppler 进行 PDF 呈现,唉。出于同样的原因,ImageMagick 使用 GhostScript 并对其进行 shell 处理。