有一些问题,可能你一直都没时间真正去搞懂,今天的主题就算其中一个。
在Windows中,很多和位图相关的结构体中,会有一个所谓的”planes”的成员。举个例子,在BITMAPINFOHEADER这个结构体中有一个biPlanes的成员,而且它还必须设置为1。在BITMAP结构体中有一个bmPlanes成员。那么,这东西,到底有啥用呢?
请听在下给翻译翻译。
EGA(Enhanced Graphics Adapter,算老古董啦)显卡驱动支持16位色。和只能支持4个颜色的CGA(Color Graphics Adapter,算老老古董啦)相比,这可是一个巨大的进步(那可不)。
如果系统支持16色的颜色空间,则每个像素需要4个位来表示。你可能会认为,将显卡内存的每个字节表示为两个像素,一个在视频区底部的四位,另一个则是顶部的四位。但由于技术原因,显存的结构并没有那么简单。
在实际的设计中,像素的位数据并不是一个接一个的摆放的,颜色通道被拆分为各自独立的单色位图。换句话说,像素被以”另外一种方式”切片。如下图所示:
在上图中,假设我们希望显示8个像素,它们的颜色值分别为 {0, 3, 5, 6, 8 B, D, E}。
显卡内存并不是按该顺序存储半个字节,而是将半字节分成它们的组成位,并将相同位置的所有位集合在一起。 换句话说,采用横向读取而不是向下读取。
在一个默认的16色的调色板中,颜色被系统按照一定的规则进行分配,例如位0表示蓝色通道,位1表示绿色通道,位2表示红色通道,位4表示强度通道。根据这个规则,这4个位可以被解释为:强度平面,红色平面,绿色平面和蓝色平面。对于最后三个平面,您可以想象每个平面都代表了如果只有相应的电子枪在发射时你看到的情况。
由于这是EGA的本机颜色格式,因此需要有一种方法在BITMAP结构中表达这种颜色格式,以便 Windows可以表示与设备相关的位图。
因此诞生了平面颜色格式。对于16色平面的位图,平面数为 4,每个像素的位数为 1。
总结
对于现代16位色/32位色的显示系统来说,不用太过担心,因为始终只会有一个颜色平面,所以简单地设置它为 1 就可以了。
所以,且把它看做一个”兼容性存在”即可。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What is the purpose of the bmPlanes member of the BITMAP structure?》