当指定明确的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))
作为小端序的Windows,
COLORREF
以RGBA格式表示。这看起来很奇怪,因为Windows内部使用的颜色格式不是BGR(A)吗?
RGBQUAD
结构被定义为typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
这里的 BGRA 和 COLORREF 不同,是一种像素格式。
因为 bitblt
函数需要一个 COLORREF
值的数组,所以每次调用时都会发生从 RGBA 到 BGRA 的额外转换,如果 Windows 使用的是 BGRA 作为其本机格式。
我记不清了,但我在某个地方也读到过 winapi 中使用的像素格式有奇怪的混合。
可以有人解释一下吗?