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

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

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

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

//调整缩略图大小 image
$ imgHeight = $ im - &gt; getImageHeight();
$ imgWidth = $ im - &gt; getImageWidth();
$ desiredWidth = 200;
$ desiredHeight = resizedImageHeight($ imgWidth,$ imgHeight,$ desiredWidth);

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

/ 调整大小图像 /
function resizedImageHeight($ imgWidth,$ imgHeight,$ desiredImgWidth){

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

返回$ height;
}
</ code> </ pre>

</ p>

原始pdf链接:</ p>

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

展开原文

原文

I am using Imagick::resizeImage to create a thumbnail PNG image of each page of a pdf file. However, the image I am getting back is really blurry. How can I make it a little sharper? Any pointers would be really appreciated.

I have tried adjusting the 'blur' paramter of Imagick::resizeImage between 0.1 - 1, without success.

$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;
}

enter image description here

original pdf link:

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

dongyou5068
dongyou5068 您还使用STYLE_NORMAL作为resize算法的参数-该参数应该是FILTER_常量之一(例如,Imagick::FILTER_LANCZOS)。但决议是主要问题。
2 年多之前 回复
doujie4787
doujie4787 我是使用imgick的新手。请你给我一些关于如何光栅化pdf的广泛指示,以及在阅读pdf文件之前我将如何设置分辨率?我想要的宽度很灵活。也许你可以分享一些代码?
2 年多之前 回复
dongxi3911
dongxi3911 PDF文件是没有像素的矢量文件,以英寸或厘米为单位。您必须将它们栅格化为像素。但是要告诉它制作光栅图像有多大,你必须告诉它你想要光栅化所需的分辨率。因此,在读取PDF之前,必须将setResolution设置为较大的值,例如300。但是你想要的宽度=200太小而无法获得任何合理的效果
2 年多之前 回复
duandu9260
duandu9260 我试过-请看编辑。
2 年多之前 回复
dounai7148
dounai7148 PHP文档中的这个注释使用“setResolution”选项:php.net/manual/en/imagick.construct.php#113801-你试过吗?
2 年多之前 回复

2个回答



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

例如:</ p>

  $ time convert -density 50 ksgt-06-04-1091539.pdf [0] x2.png \  nreal 0m0.325s 
user 0m0.299s
sys 0m0.024s
</ code> </ pre>

制作:</ p>

</ p>

-density 50 </ code>创建一个与样本相同的像素数的页面,425。</ p>
\ n

在想象中,你可以这样做(正如@ fmw42的优秀答案所说):</ p>

 #!/ usr / bin / env php 
&lt;?php

$ target_width = 400;

#获取自然大小,计算目标宽度所需的密度
$ im = new imagick();
$ im-&gt; pingImage($ argv [1]) ;
$ geo = $ im-&gt; getImageGeometry();
$ natural_width = $ geo ['width'];
$ density = 72.0 * $ target_width / $ natural_width;

#以正确的分辨率加载 for target_width
$ im = new imagick();
$ im-&gt; setResolution($ density,$ density);
$ im-&gt; readImage($ argv [1]); \ n
#和回写
$ im-&gt; writeImage($ argv [2]);
</ code> </ pre>

执行ping操作和读取操作都有点小 不幸的是,想象力很慢:</ p>

  $ time ./pdfthumb.php ksgt-06-04-1091539.pdf x.png 
real 0m2.773s
user 0m2.737s \ nsys 0m0.036s
</ code> </ pre>

这不是想象,但 vipsthumbnail </ code> 可以在一次操作中执行ping和读取:</ p>

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

如果速度很重要,可能值得考虑。 libvips有一个php绑定,所以你可以直接调用它,但如果你这样做,你会 遇到可怕的许可问题,因为它使用GPL库poppler进行PDF渲染,叹了口气。 出于同样的原因,ImageMagick使用GhostScript和shell。 </ p>
</ div>

展开原文

原文

Rather than rendering and then resizing the raster, it might be better to render the PDF to the right number of pixels in the first place. It'll be faster, and you can be sure that the amount of sharpness is correct for the content.

For example:

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

Makes:

direct sizing output

The -density 50 makes a page about the same number of pixels across as your sample, 425.

In imagick you could do it like this (as @fmw42's excellent answer already says):

#!/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]);

Doing both the ping and the read is a little slow in imagick, unfortunately:

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

It's not imagick, but vipsthumbnail can do the ping and read in one operation:

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

It might be worth considering if speed is important. libvips has a php binding so you can call it directly, but if you do that you'll run into awful licensing problems because it uses the GPL library poppler for PDF rendering, sigh. ImageMagick uses GhostScript and shells out to that for the same reason.

douluanji8752
douluanji8752 user894763的方法确实比我的好。 一个问题是您需要计算所需的密度以生成所需的像素大小。 因此,您需要以标称密度72运行命令并找到大小,然后缩放密度以获得所需的输出大小(以像素为单位)。
2 年多之前 回复
douzhendi4559
douzhendi4559 好的,添加了样本想象代码。
2 年多之前 回复
doutuo2829
doutuo2829 感谢输入,问你是如何使用php - imagick做到这一点?
2 年多之前 回复



不幸的是,我不太了解Imagick。 但是在Imagemagick命令行中,我会做有时被称为超级采样的事情。 这是使用大密度来读取PDF,然后通过反比例因子调整大小。</ p>

例如,标称密度为72 dpi。 我会以4 * 72 = 288 dpi读取输入PDF。 然后在光栅化之后,我会调整1/4 = 25%或者更大的结果大于25%,比如说50%。 这是你的第一页双向完成:</ p>

  convert -density 288 ksgt-06-04-1091539.pdf [0] -resize 25%result1.png 
</ 代码> </ pre>

</ p>

  convert -density 288 ksgt-06-04-1091539  .pdf [0] -resize 50%result2.png 
</ code> </ pre>

</ p>

< 在Imagick中,键是这样的:</ p>

  $ imagick = new Imagick();

$ imagick-&gt; setImageResolution(288,288);
$ imagick-&gt; readImage('myfile.pdf');

</ code> </ pre>
</ div>

展开原文

原文

Unfortunately, I do not know Imagick that well. But in Imagemagick command line, I would do what is sometimes called supersampling. That is use a large density to read the PDF, then resize down by the inverse scale factor.

For example, nominal density is 72 dpi. I would read the input PDF at 4*72=288 dpi. Then after rasterizing, I would resize by 1/4=25% or for a larger result by something larger than 25%, say 50%. Here is your first page done both ways:

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

In Imagick, the key is something like:

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问