如何使使用 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 处理。
我正在使用 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 处理。