为什么使用ImageMagick从此PDF渲染PNG会产生这些条纹状伪影?

3

我正在运行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 有趣的是,关闭抗锯齿可以解决问题,但不适用于我们的用例。

一个快速的解决方法(等待代码审核)是将目标大小无抗锯齿转换为2x,4x或更多倍大小,然后使用抗锯齿重新调整大小。 - Jongware
3个回答

1
更新 Ghostscript 至 9.23 版本并重新安装 Imagemagick。

1
我遇到了同样的问题,我认为Ghostscript 9.22是问题所在。我可以通过直接运行Ghostscript来重现这个问题:
gs -dSTRICT -dDOINTERPOLATE -dNOPAUSE -dEPSCrop -dBATCH -sOutputFile=test.png -sDEVICE=pngalpha /path/to/broken.pdf

我还测试了Ghostscript 9.21,它的表现符合预期。
当使用+antialias命令运行imagemagick的convert命令时,它会向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。
  • 按上面建议的方式将尺寸放大两倍,然后缩小尺寸。

无论我是修改delegates.xml文件还是用+antialisaing转换,都无法消除条纹。 - jan-glx

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版本有问题,尝试升级一下。

1
我正在运行GhostScript 9.22、libpng 1.6.34和ImageMagick 7.0.7-11 Q16,这些都是在你的工作版本之前的。 - jrlocke
我尝试使用IM 7.0.7.13 Q16 Mac OSX Sierra,搭配Ghostscript 9.21和libpng @1.6.30_0,对我来说仍然可以正常工作。 - fmw42

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