检测PostScript文件中的颜色

检测PostScript文件中的颜色,postscript,Postscript,我需要确定postscript文件是以彩色还是黑白形式发送到打印机。虽然有很多解决方案,但它们似乎大多需要呈现文档,然后使用ghostscript单独检查每个页面,对于较大的文档,这可能有点慢。我想知道下面的grep是否会提供相同的信息,或者是否缺少其他类型的颜色 grep'setrgbcolor\| setcymkcolor\| colorimage'foo.prn您距离PostScript中提供的全部颜色空间还有很长的路要走。您没有setcolorspace,setcolorspace接受一

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


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

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

你也没有考虑CIEBasedA,也没有考虑C=M=Y=0,K是灰度的事实,尽管它是用CMYK空间表示的,当然R=G=B是用RGB空间表示的s灰度。同样地,/separation/Black将绘制灰色阴影

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

/rg /setrgbcolor load def
将触发您的grep,即使PostScript程序当时没有使用
rg

然后是图像
COLORRIMAGE
不是在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?我也暗示了这一点。这是一种“浓黑”,一般聪明的用户都会避免使用它,因为它产生的往往是一层泥浆。这取决于你是否认为这是“黑色”或“颜色”。它通常是由来自其他颜色空间的原始颜色转换引起的,在我看来可能应该被视为黑色。但从视觉上看,它可能是深棕色或紫色。