【问题标题】:Ghostscript color detectionGhostscript颜色检测
【发布时间】:2012-08-31 05:50:35
【问题描述】:

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

【问题讨论】:

    标签: pdf colors png ghostscript grayscale


    【解决方案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 归档。

    【讨论】:

    • ...我很确定您的陈述 “你不能这样做” 直到大约一年前是正确的,但它不再是:- ) -- 所以请在你的答案被否决之前删除(或编辑)你的答案...... :-)
    猜你喜欢
    • 2010-11-27
    • 2011-11-22
    • 2014-05-13
    • 1970-01-01
    • 2013-05-06
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多