检测 PostScript 文件中的颜色

Detecting color in PostScript files

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

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

您距离 PostScript 中可用的全部颜色 space 还差得很远。你没有 setcolorspace 并且 setcolorspace 接受一个复杂的参数数组,其中可以包括 /DeviceGray(所以不是颜色)。

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

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

/rg /setrgbcolor load def

会触发您的 grep,即使 PostScript 程序当时没有使用 rg

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

您可以编写一个 PostScript 程序,其中 'hooks' 颜色运算符的定义,并让该代码询问参数以确定规格是否为灰色 space,图像要难得多处理 因为,如果你想要可靠性,你需要查看图像样本数据,看看它是否真的只是一个灰色图像。

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