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

时间:2018-04-14 06:16:22

标签: php imagemagick imagick resize-image

我正在使用Imagick :: resizeImage来创建pdf文件的每个页面的缩略图PNG图像。然而,我回来的图像真的很模糊。我怎样才能让它变得更清晰?任何指针都会非常感激。

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

List

enter image description here

原始pdf链接:

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

2 个答案:

答案 0 :(得分:3)

不是渲染然后调整栅格大小,最好先将PDF渲染到正确的像素数。它会更快,你可以确定内容的清晰度是正确的。

例如:

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

使:

direct sizing output

-density 50制作一个与您的样本相同的像素数的页面,425。

在想象中你可以这样做(正如@ 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]);

不幸的是,在想象中做ping和读取都有点慢:

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

这不是想象,但是vipsthumbnail可以执行ping并在一次操作中读取:

$ 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。

答案 1 :(得分:2)

不幸的是,我不清楚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

enter image description here

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

enter image description here

在Imagick中,关键是:

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