Ghostscript颜色检测

11

我似乎找不到Ghostscript是否能够简单地检测作业是彩色还是灰度的信息。我使用Ghostscript将打印作业转换为PNG,但我也需要有关作业颜色的信息,这样我就不必再逐像素搜索它。

2个回答

26

一种相对较新的Ghostscript设备名为inkcov(需要Ghostscript v9.05或更新版本),可以可靠地检测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以便通过Web更轻松地显示):

4 PDF pages without directly visible color

在印前行业中,经常使用“丰富”的黑色或灰色。这个说法用于表达这些阴影不是由纯黑色调色剂或油墨制成的,而是混有颜色成分,使它们看起来更加明亮和饱和。

现在检查每个页面的油墨覆盖范围:

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 页没有使用青色(Cyan)、洋红色(Magenta)、黄色(Yellow)颜色,只用了黑色(K)。
  • 第 2 和 3 页使用了青色(Cyan)、洋红色(Magenta)、黄色(Yellow)颜色的油墨,但没有使用黑色(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

再次强调,如果颜色转换成功,则会得到预期的结果!


如果您需要估算打印文件的色调覆盖率,这也是一种快速的方法。 - Douglas Anderson
如果有人需要在Ruby中执行此操作,可以使用以下gem https://rubygems.org/gems/pdf_colored_pages。该gem通过解析ghostscript inkcov输出,输出包含页面编号(例如1,3,4)或范围字符串(如“1,3-4”)的数组。 - RedRoosterMobile

1
一个新的输出设备已经使得这个答案过时了,请查看被接受的答案。

直到2011年,需要将文件光栅化才能看到输出。由于PDF/PS是描述文件外观的说明,它在被光栅化时会呈现出来。即使你可以使用Ghostscript做到这一点,我相信它仍然需要先对文件进行光栅化/解释,然后再查看输出,因此如果您有png文件,您最好自己这样做,这比再次使用GS处理文件少了cpu负担。


我非常确定你的说法“你做不到这个”在一年前是正确的,但现在不再是了 :-) 所以在它被踩之前请删除(或编辑)你的回答... :-) - Kurt Pfeifle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接