如何检查位图的颜色深度?

9
我正在开发一个应用程序,它可以打印包含JPEG和TIFF格式的图像文件夹。其中TIFF图像通常是黑白(1bpp)的。
加载图像后,我想确定图像是彩色、黑白还是灰度,以便将图像发送到正确的打印机(彩色打印机或黑白打印机)。
我使用Bitmap构造函数image = new Bitmap(filename);来加载图像。
编辑:检查像素深度对于黑白图像很好。有没有办法在不迭代每个像素的情况下检查图像是否为灰度?

使用其 PixelFormat 属性。 - Neil
2个回答

13

只需检查该属性即可

image.PixelFormat

它将匹配System.Drawing.Imaging.PixelFormat中的一个值。

虽然您想将不仅仅是黑白色发送到黑白打印机,但您也应该将任何灰度发送到那里。


太疯狂了,我在 Bitmap 类的成员列表中挖掘了一番,不确定自己是怎么错过它的。 - Chris Thompson
我还没有接受答案,因为我正在测试它。我也考虑过如何检查灰度。也许我应该编辑问题以澄清。 - Chris Thompson

3

检查的正确方法是:

对于JPEG文件,您应该使用位图的PropertyItems集合检查适当的属性。这可能包含适当的EXIF标签以帮助确定位深度。下一步是解析JPEG头并查找“框架开始”标记,然后查找图像中的组件数量。

最终方法是将JPEG加载到位图对象中,并将像素数与公式(宽度*高度*每像素字节数)进行比较。因此,如果加载位图并且实际原始数据的字节数等于(宽度*高度),则可以肯定地认为该图像每像素有1个字节,并且是灰度。

您最后需要检查的是位图本身的PixelFormat。

对于TIFF文件格式,您应该使用PropertyItems集合执行相同的操作,并检查规范中提到的适当标记。如果这些方法失败,则进行图像字节比较,并最后使用PixelFormat属性。


说实话,我不确定你应该如何找出JPEG的“实际原始数据字节数”。毕竟,JPEG文件是压缩的。而且,虽然我猜这对于JPEG来说是正确的,但通常情况下,每像素1字节的图像只是8位索引图像,并不一定是灰度图像。 - Nyerguds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接