ImageMagick将PDF转换为JPEG后,升级到6.7.8版本后文本质量较差。

37

升级了 ImageMagick 后,将pdf转换为jpeg时文本质量下降:

旧图片 enter image description here

新图片 enter image description here 转换命令:convert foo.pdf foo.jpeg

旧的 ImageMagick 版本:

[root@home]#  convert -version
Version: ImageMagick 6.2.8 05/07/12 Q16 file:/usr/share/ImageMagick-6.2.8/doc/index.html
Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC

生成文件大小:

-rw-r--r-- 1 root root 139K Apr  2 16:11 foo-0.jpeg
-rw-r--r-- 1 root root 130K Apr  2 16:11 foo-1.jpeg
-rw-r--r-- 1 root root 334K Mar 24 14:27 foo.pdf

升级ImageMagick后

[root@home]#  convert -version
Version: ImageMagick 6.7.8-10 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP

生成的文件大小:

-rw-r--r-- 1 root root  60K Apr  2 16:11 foo-0.jpeg
-rw-r--r-- 1 root root  55K Apr  2 16:11 foo-1.jpeg
-rw-r--r-- 1 root root 334K Mar 24 14:27 foo.pdf

我尝试使用antialias标志:

(意为:我尝试使用“抗锯齿”标志:)
convert -antialias  foo.pdf foo.jpeg

尝试将quality设置为更高值,但仍然没有效果:

convert -quality 100 foo.pdf foo.jpeg

并且使用超级采样

convert -density 288 -background white -alpha off foo.pdf -resize 25%  foo.jpeg

两种新的ImageMagick版本在生成更大的文件和更好的结果方面表现良好,但运行时间更长,质量较旧版ImageMagick版本低。

有什么建议吗?

文件链接


尝试使用更高版本的ImageMagick了吗?$ convert --version 版本:ImageMagick 6.7.7-10 2012-08-17 Q16。这是在Linux Mint Nadia上。 - Atle
谢谢@Atle,我已经尝试过了,potatoe的答案非常好用! - Kuf
太好了!但是我很好奇,所以我不得不谷歌一下,看起来 delegate.xml 之所以被更改是有原因的:http://www.imagemagick.com/discourse-server/viewtopic.php?t=18184&p=69472#p69445 只是让你知道。 - Atle
谢谢提醒!下周会发送给 QA,如有任何问题将进行更新。 - Kuf
2
您需要使用-alpha remove而不是-alpha off - Skippy le Grand Gourou
显示剩余3条评论
4个回答

38

我在你的示例文件中看到了同样的问题。看起来ImageMagick用于PDF转换的委托可能已经随新安装而更改。

如果您尝试convert -verbose foo.pdf foo.jpeg,请问您是否能在发送给gs的命令中看到-sDEVICE=pngalpha?过去曾使用过pnmraw设备,切换回它似乎对我的问题有所帮助。

在ImageMagick的delegates.xml文件中(可能位于/ etc / ImageMagick中,但根据您的设置可能在其他地方),查找decode="ps:alpha"代理行,并将命令中的-sDEVICE=pngalpha更改为-sDEVICE=pnmraw。(您可以在文件中搜索pngalpha。)


1
很高兴听到这个消息。在ImageMagick中进行PDF转换可能会很麻烦,但当它工作时确实很棒。 - potatoe
1
想使用此解决方案的人应该知道 delegate.xml 是有原因被更改的,以免为自己带来其他问题:http://www.imagemagick.com/discourse-server/viewtopic.php?t=18184&p=69472#p69445 - Atle
7
谢谢提供链接,这是一个很好的观点。该评论还提出了我考虑过但忘记在回答中包括的一些内容:您可以直接使用Ghostscript进行PDF转换,尽管它不太易于使用。像这样:gs -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r150 -sOutputFile=foo-%d.jpg foo.pdf - potatoe
3
我发现只需添加"-flatten"参数即可解决问题,无需编辑delegates.xml文件。 "convert image.png -flatten image.jpg" - newtriks
2
看起来问题出在处理 alpha 通道上,此时另一个(经过测试的)选项是使用 -alpha remove。newtricks 建议的 -flatten 选项也可以解决问题。 - Skippy le Grand Gourou
显示剩余4条评论

13

看起来问题出在DPI上。在转换PDF时,Imagemagick使用Ghostscript。您可以跳过使用Imagemagick。

$ gs -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dGridFitTT=2 -dUseCropBox -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r200x200 -sDEVICE=jpeg -dJPEGQ=100 -sOutputFile=foo-%05d.jpg foo.pdf

将-r选项设置为更高的值。 Ghostscript 的默认值为100DPI。

或者使用转换选项-density。该选项设置PDF转换后的DPI。

$ convert -density 200x200 foo.pdf foo.jpg

0

PDF文件是矢量文件,没有特定的大小。它们的大小由在读取PDF文件之前定义密度和单位来控制。您可以通过超采样获得相同期望输出文件大小的更好质量。这意味着将PDF光栅化为较大的尺寸,然后调整为所需的实际尺寸。例如,在ImageMagick中:

convert -units pixelsperinch -density 288 image.pdf -resize 25% output.jpg

如果不指定密度,则默认密度为72 dpi。因此,72*4=288。然后按1/5=25%的比例调整大小,可以回到相同的默认大小,但应该看起来更好。根据需要更改密度或调整大小以处理所需的质量和最终大小。


0

最简单的方法是你自己提出的解决方案之一。

你只需要使用+antialias来禁用添加抗锯齿边缘像素,而不是使用-antialias

convert +antialias foo.pdf foo.jpeg

文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接