Ghostscript颜色检测
Posted
技术标签:
【中文标题】Ghostscript颜色检测【英文标题】:Ghostscript color detection 【发布时间】:2012-08-31 05:50:35 【问题描述】:我似乎无法找到 Ghostscript 是否能够简单地检测作业是彩色还是灰度。我使用 Ghostscript 将打印作业转换为 PNG,但我还需要有关作业颜色的信息,因此我不必再次逐像素搜索。
【问题讨论】:
【参考方案1】:名为inkcov
(您需要Ghostscript v9.05 或更高版本)的(相对较新的)Ghostscript 设备可以可靠地检测PDF 页面是否使用颜色。
它显示 CMYK 墨水的墨水覆盖率,分别针对每一页(对于 RGB 颜色,它在内部进行到 CMYK 颜色空间的静默转换)。
为了研究和演示它的功能,首先在 Ghostscript 的帮助下生成一个示例 PDF:
gs \
-o color-or-grayscale-test.pdf \
-sDEVICE=pdfwrite \
-g5950x2105 \
-c "/F1 10 80 moveto /Helvetica findfont 64 scalefont setfont def" \
-c "F1 (100% 'pure' black) show showpage" \
-c "F1 .5 .5 .5 setrgbcolor ( 50% 'rich' rgbgray) show showpage" \
-c "F1 .5 .5 .5 0 setcmykcolor ( 50% 'rich' cmykgray) show showpage" \
-c "F1 .5 setgray ( 50% 'pure' gray) show showpage"
虽然所有页面在人眼看来确实没有使用任何颜色,但第 2 页和第 3 页确实将它们的明显灰度值与颜色混合在一起。但是没有一种颜色是直接可见的(除非您的显示器严重错误调整)。
查看生成的 PDF 页面(转换为 PNG 以便于通过网络显示):
在印前行业,经常使用“丰富”的黑色或灰色阴影。成语“丰富”的黑色或灰色用于表示这些色调不是由纯黑色墨粉或墨水制成,而是混合了颜色成分,使它们看起来更鲜艳、更饱和。
现在检查每一页的墨水覆盖率:
gs -o - -sDEVICE=inkcov color-or-grayscale-test.pdf
[...]
Page 1
0.00000 0.00000 0.00000 0.05040 CMYK OK
Page 2
0.05401 0.05401 0.05401 0.05401 CMYK OK
Page 3
0.05799 0.05799 0.05799 0.00000 CMYK OK
Page 4
0.00000 0.00000 0.00000 0.04541 CMYK OK
(值 1.00000 映射到相应颜色通道的 100% 墨水覆盖率。因此结果第一行中的 0.05040
表示页面区域的 5.04 %
被黑色墨水覆盖。)因此给出的结果Ghostscript 的inkcov
正是预期的:
现在让我们将原始 PDF 的所有页面转换为使用 DeviceGray
色彩空间:
gs \
-o only-black-ink.pdf \
-sDEVICE=pdfwrite \
-dColorConversionStrategy=/Gray \
-dProcessColorModel=/DeviceGray \
color-or-grayscale-test.pdf
...再次检查墨水覆盖率:
gs -q -o - -sDEVICE=inkcov only-black-ink.pdf | grep -v Page
0.00000 0.00000 0.00000 0.05040 CMYK OK
0.00000 0.00000 0.00000 0.05401 CMYK OK
0.00000 0.00000 0.00000 0.05799 CMYK OK
0.00000 0.00000 0.00000 0.04541 CMYK OK
同样,如果颜色转换成功,这正是预期的结果!
【讨论】:
如果您需要估计打印文件的碳粉覆盖率,这也是一种快速方法。 如果有人需要在 ruby 中执行此操作,这里有一个 gem rubygems.org/gems/pdf_colored_pages,它输出一个包含页码的数组(例如 1,3,4)或一个范围字符串,如 '1,3- 4',通过解析 ghostscript inkcov 输出。【参考方案2】:新的输出设备已使此答案过时,请参阅已接受的答案。
在 2011 年之前,需要对文件进行光栅化才能看到输出。由于 PDF/PS 是对文件外观的描述,该文件在光栅化时被渲染。即使您可以使用 ghostscipt 执行此操作,我确信它需要先光栅化/解释文件然后查看输出,因此如果您有 png 文件,您也可以自己执行此操作,这将比处理再次向 GS 归档。
【讨论】:
...我很确定您的陈述 “你不能这样做” 直到大约一年前是正确的,但它不再是:- ) -- 所以请在你的答案被否决之前删除(或编辑)你的答案...... :-)以上是关于Ghostscript颜色检测的主要内容,如果未能解决你的问题,请参考以下文章
Ghostscript - 错误的 CMYK 颜色转换 - 100% 黄色转换为 98% 黄色?