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 正是预期的:

第 1 + 4 页不使用任何 C(青色)、M(洋红色)、Y(黄色)颜色,而只使用 K(黑色)。 第 2 + 3 页确实使用了 C(青色)、M(洋红色)、Y(黄色)颜色的墨水,但根本没有使用 K(黑色)。

现在让我们将原始 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 图像质量问题

Ghostscript 将图像/表单与文本文件合并

使用 ghostscript 替换 PDF 中的颜色

Ghostscript - 错误的 CMYK 颜色转换 - 100% 黄色转换为 98% 黄色?

使用 ghostscript 从 PDF 或 PS 生成“颜色正确”栅格的最佳方法

Ghostscript 如何处理没有颜色的矢量对象