【问题标题】:Detecting color in PostScript files检测 PostScript 文件中的颜色
【发布时间】:2018-11-15 16:15:35
【问题描述】:

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

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

【问题讨论】:

    标签: postscript


    【解决方案1】:

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

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

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

    /rg /setrgbcolor load def
    

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

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

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

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

    【讨论】:

    • 非常感谢您的详细解释!
    • 作为后续,我正在尝试确定哪些 CMYK 值将被视为黑白/灰度,哪些将被视为彩色(用例是打印计费)。你有什么资源可以让我读到这种僵硬的东西吗?
    • 好吧,我个人认为 C=M=Y=0 和 K != 0 的任何东西都是灰度的。通常,PostScript 用户会尽量避免通过组合相同的 C、M 和 Y 值来产生“浓黑”,因为在使用真正的墨水和介质时,它通常会产生棕色而不是。因此,前 3 个通道中的任何一个非零的任何 CMYK 颜色规范都将是颜色。
    • “因此,前 3 个通道中的任何一个非零的任何 CMYK 颜色规范都将是颜色。”即使 C=M=Y=0 和 K != 0?
    • 我也确实提到了这一点,暗示。那是一种“浓郁的黑色”,通常聪明的用户会避开它,因为它产生的通常是泥泞的阴影。是否将其视为“黑色”或“颜色”取决于您。它通常是由其他颜色空间的天真颜色转换引起的,可能应该被视为黑色 IMO。但在视觉上它可能是深棕色或紫色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2012-08-31
    • 2011-11-22
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多