一个只能显示黑色和白色象素的显示器,每个象素只需要一个位内存来存放。彩色显示每个象素需要多位来存放。色彩数越多,需要的象素越多。
“全彩色”显示分辨率每个象素用24位存放——红色占用8位,绿色占用8位,蓝色占用8位。“高彩色”显示分辨率每个象素用16位存放,通常红色5位,绿色6位,蓝色5位。绿色占用的位数比其他两种原色多是因为人类的眼睛对绿色的变化比其他两种原色的变化更敏感。
一块能显示256种色彩的显卡需要8位来存放每个象素。然而,8位值通常是一张定义了真实颜色的调色板(表)的索引。最后,一块16色显卡需要4位来保存每个象素。所谓的16色为,暗和亮的红,绿,蓝,青,洋红,黄,两种灰度梯度,黑和白。这些16色可以追溯到老的IBM的CGA时代。
只有一些特殊的编程工作有必要知道显卡的显存里面的内存是如何组织的,GetDeviceCaps会帮助你决定这些。显存中可以把表示每个象素的一串位放在一起,也可以将表示相同颜色的位放在同一个内存平面上,将表示不同颜色的位放在不同内存平面上。这个函数返回内存平面的数目
iPlanes=GetDeviceCaps(hdc,PLANES);
这个函数返回每个象素占用的位数
iBitsPixel=GetDeviceCaps(hdc,BITSPIXEL);
这两个函数其中有一个返回1。能显示的颜色数可以这样来计算
iColors = 1 << (iPlanes*iBitsPixel);
还有一个函数返回颜色数
iColors=iGetDeviceCaps(hdc,NUMCOLORS);
这个值可能跟上面一个值相等,也可能不相等。
上面提到,256色的显示适配器是使用调色板的。如果那样的话,GetDeviceCaps用参数NUMCOLORS索引返回的颜色数是windows保留的颜色数,通常是20。剩下的236种颜色程序通过调色板管理器设置。
在很多GDI函数中,你使用COLORREF值(通常是32位无符号长整数)来引用一个特定的颜色COLORREF值根据红绿蓝的强度来指定一个颜色,通常被成为RGB颜色。0到7位位红,8到15位位绿,16到24位为蓝,25到32为为0。在windows头文件中定义了一个宏RGB(r,g,b)来方面使用COLORREF参数。如RGB(255,255,0)值为0X0000ffff。GetRValue,GetGValue,GetBValue宏从COLORREF参数中提取出原色值。
在16色或256色显示适配器上,windows使用“抖动”来模拟更多的颜色。抖动包含一个结合各种不同颜色象素的小图案。你可是使用GetNearestColor来确定最近的没有抖动过的颜色值。
crPureColor = GetNearestColor(hdc,crColor);