为什么使用 imagemagick 从此 pdf 渲染 png 会创建这些条纹伪影?

Why does rendering a png from this pdf using imagemagick create these streaky artifacts?

我是 运行 ghostscript 9.22、libpng 1.6.34 和 imagemagick 7.0.7-11 Q16

这是重现问题的命令:

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

这是输入 PDF 的 link: https://www.pdf-archive.com/2017/12/06/icon/

这是我看到的输出,带有条纹状的水平线伪影:

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

这个命令对我使用 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

我怀疑这是您的 Ghostscript 或 libpng 版本。尝试升级。

我正在 运行 遇到同样的问题,我认为 Ghostscript 9.22 是问题所在。我可以直接通过 运行ning 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

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

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

  • 编辑 imagemagick 的 delegates.xml 以强制 -dGraphicsAlphaBits 为 1。
  • 安装 ghostscript 9.21,似乎不受影响。
  • 按照上面的建议进行双倍尺寸转换,然后缩小尺寸。

将 ghostscript 更新到版本 9.23 并重新安装 imagemagick。