首页 > 解决方案 > 检测 PostScript 文件中的颜色

问题描述

我需要确定 postscript 文件是以彩色还是黑白形式发送到打印机的。虽然有很多解决方案,但它们似乎大多需要渲染文档,然后使用 ghostscript 单独检查每个页面,这对于较大的文档可能会有点慢。我想知道以下 grep 是否会给我相同的信息,或者是否缺少其他类型的颜色?

grep 'setrgbcolor\|setcymkcolor\|colorimage' foo.prn

标签: postscript

解决方案


您与 PostScript 中可用的全部颜色空间相去甚远。你没有setcolorspace并且 setcolorspace 需要一个复杂的参数数组,其中可以包括 /DeviceGray (所以不是颜色)。

您也没有考虑 CIEBasedA 也没有考虑 C=M=Y=0, K 是灰度的事实,即使它在 CMYK 空间中表示,当然 R=G=B 是在 RGB 空间中表示的灰度阴影。同样 /Separataion /Black 将绘制灰色阴影。

此外,PostScript 是一种编程语言;包含一个序言是很常见的,它以一种方便 PostScript 生成应用程序的作者的方式定义操作。序言可以包括在该特定程序中未使用的功能。所以像:

/rg /setrgbcolor load def

会触发你的 grep,即使 PostScript 程序没有使用rg.

然后是图像。colorimage不是在 PostScript 中绘制图像的唯一方法,image运算符采用字典操作数,并且可以包含颜色空间。如上所述,有可能在不同的颜色空间中表示灰度图像(低效,可能,但合法)。

您可以编写一个 PostScript 程序,它“挂钩”颜色运算符的定义,并让该代码询问参数以确定规范是否为灰色空间,图像更难处理,因为如果您想要可靠性,您需要查看图像样本数据,看看它是否实际上只是一张灰度图像。

可以编写一个可以完成这项工作的 Ghostscript 设备,因为它将接收所有操作。它仍然不会很快,因为它必须解释整个文件以检测每个操作。即使这样,这样的工具也可能在特定应用中被击败。例如,如果设备颜色空间是灰色、RGB 或 CMYK,则代码可以询问底层设备并采用不同的代码路径。但这在任何现实世界的 PostScript 程序中都不太可能发生。


推荐阅读