为什么使用imagemagick从这个pdf渲染一个png创建这些条纹工件?

时间:2017-12-06 02:47:57

标签: pdf imagemagick png imagemagick-convert image-conversion

我正在运行ghostscript 9.22,libpng 1.6.34和imagemagick 7.0.7-11 Q16

以下是复制问题的命令:

convert -density 400 icon.pdf -scale 1024x1024 ./appicon-1024x1024.png

以下是输入PDF的链接: https://www.pdf-archive.com/2017/12/06/icon/

这是我看到的输出,带有条纹水平线的工件: app-icon

有趣的是,关闭抗锯齿可以解决问题,但不适合我们的用例。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我认为Ghostscript 9.22就是问题所在。我可以直接运行Ghostscript来重现这个问题:

gs -dSTRICT -dDOINTERPOLATE -dNOPAUSE -dEPSCrop -dBATCH -sOutputFile=test.png -sDEVICE=pngalpha /path/to/broken.pdf

我还测试了Ghostscript 9.21,它按预期工作。

当imagemagick的convert命令与+antialias一起运行时,它会将不同的开关传递给ghostscript。

您可以使用-verbose开关告诉imagemagick打印出用于调用gs的整个命令:

$ convert -verbose test.pdf test.png

哪个收益率:

'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 '-sDEVICE=pamcmyk32' -dTextAlphaBits=4 -dGraphicsAlphaBits=4 '-r72x72' -g1728x1728 -dEPSCrop ...

设置抗锯齿标志:

$ convert -verbose +antialias test.pdf test-with-antialias-flag.png

给我们:

'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 '-sDEVICE=pamcmyk32' -dTextAlphaBits=1 -dGraphicsAlphaBits=1 '-r72x72' -g1728x1728 -dEPSCrop

那里设置了几个不同的开关。基于直接运行gs的一些实验,我发现-dGraphicsAlphaBits似乎是罪魁祸首。如果将其设置为大于1的值,则行将显示在输出中。

所以有一些潜在的解决方法:

  • 编辑imagemagick的delegates.xml以强制-dGraphicsAlphaBits为1。
  • 安装ghostscript 9.21,似乎不受影响。
  • 如上所述,以双倍尺寸转换然后缩小尺寸。

答案 1 :(得分:1)

将ghostscript更新到9.23版,然后重新安装imagemagick。

答案 2 :(得分:0)

使用ImageMagick 6.9.9.25 Q16 Mac OSX和Ghostscript 9.21以及libpng @ 1.6.30_0这个命令对我来说非常合适。

convert -density 400 icon.pdf -scale 1024x1024 test.png

enter image description here

我怀疑它是你的Ghostscript或libpng版本。尝试升级。