GraphicsMagick 无法识别 PDF 的背景透明度
Posted
技术标签:
【中文标题】GraphicsMagick 无法识别 PDF 的背景透明度【英文标题】:GraphicsMagic is unable to identify background transparency of PDF 【发布时间】:2014-09-01 10:09:45 【问题描述】:GM 无法识别 PDF 的背景透明度,使用“gm convert”创建的 PNG 获得白色背景,而同一 PDF 被 IM 转换为具有透明背景的 PNG。
$convert -verbose /var/tmp/abc.pdf /var/tmp/abc.png
/var/tmp/magick-16370Tq7WYv5U54Pa1 PNG 288x720 288x720+0+0 8 位 sRGB 20.7KB 0.000u 0:00.009 /var/tmp/abc.pdf PDF 288x720 288x720+0+0 16 位 sRGB 20.7KB 0.000u 0:00.000 /var/tmp/abc.pdf=>/var/tmp/abc.png PDF 288x720 288x720+0+0 8 位 sRGB 17c 16.6KB 0.010u 0:00.009 [ghostscript 库] -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile= /var/tmp/magick-16370Tq7WYv5U54Pa%d" "-f/var/tmp/magick-16370CVWmPbzBmjpF" "-f/var/tmp/magick-16370khy6Y-G3TgtO"
$gm convert -verbose /var/tmp/abc.pdf /var/tmp/abc.png
gm 转换:“gs”“-q”“-dBATCH”“-dMaxBitmap=50000000”“-dNOPAUSE”“-sDEVICE=pnmraw”“-dTextAlphaBits=4”“-dGraphicsAlphaBits=4”“-r72x72”“ -sOutputFile=/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmoCp6rG""--""/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmBEgWnK""-c""退出"。 /var/tmp/abc.pdf PDF 288x720+0+0 DirectClass 8 位 607.6K 0.000u 0:01 /var/tmp/abc.pdf=>/var/tmp/abc.png PNG 288x720+0+0 DirectClass 8 位 0.000u 0:01 经过进一步调查,IM 的“识别”似乎可以正确识别 PDF 中的背景,而 GM 的“gm 识别”则不能。
$identify -verbose abc.pdf
图片:abc.pdf 格式:PDF(便携式文档格式) 类型:双层 色彩空间:灰色 深度:16/4 位 通道深度: 灰色:1 位 阿尔法:4位 阿尔法:graya(255,0)#FFFFFFFFFFFF0000 颜色:16 背景颜色:graya(255,1) 透明色:graya(0,0) 版本:ImageMagick 6.8.9-1 Q16 x86_64 2014-07-01 http://www.imagemagick.org
$gm identify -verbose abc.pdf
gm 识别:“gs”“-q”“-dBATCH”“-dMaxBitmap=50000000”“-dNOPAUSE”“-sDEVICE=pnmraw”“-dTextAlphaBits=4”“-dGraphicsAlphaBits=4”“-r72x72”“ -sOutputFile=/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmzhBEIk""--""/var/folders/6d/n_hv45rs1jv17nxwfjwj776cspn_3c/T/gmAPm2Po""-c""退出"。 图片:abc.pdf 格式:PDF(便携式文档格式) 类型:灰度 深度:每像素 4 位分量 渠道深度: 灰色:4 位 背景颜色:白色 评论:GPL Ghostscript 生成的图像(device=pnmraw) 签名:215f1c08ec575526ce398d193c4df22faaea100c10255e0db747641bdaaeac49 污染:错误
【问题讨论】:
sourceforge 链接:sourceforge.net/p/graphicsmagick/discussion/250738/thread/… 【参考方案1】:您的 (ImageMagick) convert
和您的 (GraphicsMagick) gm convert
命令产生不同输出的原因是:
这两个实用程序不能够直接处理 PDF 输入文件,都只能处理评估图像格式。
为了处理 PDF 输入文件,这两个实用程序都求助于 'delegate' 程序:在这两种情况下,这都是 Ghostscript(CAN 处理 PDF 输入文件)。
然而,这两个实用程序都使用 不同 'delegate command lines'(可以在引用的 -verbose
命令行输出中直接看到:
我。 convert
使用作为其 Ghostscript 输出设备 pngalpha
。
二。 gm convert
employs 作为其 Ghostscript 输出设备 pnmraw
.
然后,两个实用程序都将其委托命令的输出处理为最终(光栅)格式文件。
问题是:光栅格式 'pnmraw' 不支持透明度(alpha 通道),但 'pngalpha' 支持。因此,首先将 PDF 输入转换为 pnmraw 的实用程序丢失了透明页面背景,并用(不透明)白色背景替换了它们。
除非您修改 GraphicsMagick 设置以使其在其委托命令中使用 pngalpha
(与 ImageMagick 使用的相同),否则您的 gm convert
将不会显示透明背景。
【讨论】:
【参考方案2】:只是想添加到Kurt Pfeifle 答案,因为它为我指出了这个解决方案。他所指的配置可在 delegates.mgk 文件 (graphicsmagick/1.3.19_1/lib/GraphicsMagick/config) 中找到。
对我来说,问题是这一行:
<!-- Read color Postscript, EPS, and PDF -->
<delegate decode="gs-color" stealth="True" command='"gs" -q -dBATCH -dMaxBitmap=50000000 -dNOPAUSE -sDEVICE=ppmraw -dTextAlphaBits=%u -dGraphicsAlphaBits=%u -r%s %s "-sOutputFile=%s" -- "%s" -c quit' />
我改成:
<delegate decode="gs-color+alpha" stealth="True" command='"gs" -q -dBATCH -dMaxBitmap=50000000 -dNOPAUSE -sDEVICE=pngalpha -dTextAlphaBits=%u -dGraphicsAlphaBits=%u -r%s %s "-sOutputFile=%s" -- "%s" -c quit' />
而且我的 png 会带有透明背景!
【讨论】:
以上是关于GraphicsMagick 无法识别 PDF 的背景透明度的主要内容,如果未能解决你的问题,请参考以下文章
缩略图来自 GraphicsMagick 中流的 pdf 的第一页
将 ImageMagick 命令转换为 GraphicsMagick
验证码识别工具GraphicsMagick1.3.25和Tesseract-OCR4.0.0 Linux安装部署过程记录