指定显式RGB颜色时,COLORREF值具有以下十六进制形式:
0x00bbggrr
低位字节包含红色相对强度的值; 第二个字节包含绿色值; 第三个字节包含蓝色的值.高位字节必须为零.单个字节的最大值为0xFF.
从 wingdi.h
#define RGB(r,g,b) ((COLORREF)((BYTE)(r) | ((BYTE)(g) << 8) | ((BYTE)(b) << 16)))
#define GetRValue(rgb) ((BYTE) (rgb) )
#define GetGValue(rgb) ((BYTE) ((rgb) >> 8))
#define GetBValue(rgb) ((BYTE) ((rgb) >> 16))
Run Code Online (Sandbox Code Playgroud)
由于windows是小端,COLORREF是RGBA格式.这看起来很奇怪,因为它不是Windows内部使用的颜色格式,BGR(A)?
的RGBQUAD结构被定义为
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
Run Code Online (Sandbox Code Playgroud)
这与COLORREFBGRA 不同.
由于bitblt函数需要一组COLORREF值,这意味着如果Windows使用BGRA作为其本机格式,则在每次调用期间总会有一个从RGBA到BGRA的额外转换.
我不记得了,但我也读到某处,在winapi中使用的像素格式有一种奇怪的混合.
有人可以解释一下吗?
COLORREF 的历史可以追溯到像素格式标准化程度较低的时期。许多图形适配器仍然使用调色板而不是完整的 24 位或 32 位颜色,因此即使您的适配器需要字节重新排序,您也不需要执行很多操作。一些图形适配器甚至将图像存储在单独的颜色平面中,而不是存储在多通道颜色的单个平面中。那时没有“正确”的答案。
RGBQUAD 来自 BMP 格式,正如 Raymond Chen 在评论中提到的,它来自 OS/2 位图格式。