为什么使用 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。
我是 运行 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。