繁体   English   中英

为什么Windows GDI使用RGBA格式代替`COLORREF`而不是BGRA?

[英]Why does windows GDI use RGBA format for `COLORREF` instead of BGRA?

MSDN声明

指定显式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;

COLORREF不同,BGRA。

由于bitblt函数需要一个COLORREF值数组,这意味着如果Windows使用BGRA作为其本机格式,则在每次调用期间总会有一个从RGBA到BGRA的额外转换。

我不记得了,但我也读到某处,在winapi中使用的像素格式有一种奇怪的混合。

有人可以解释一下吗?

COLORREF可以追溯到像素格式标准化程度要低得多的时候。 许多图形适配器仍然使用调色板而不是完整的24位或32位颜色,因此即使您的适配器需要重新排序字节,您也不需要执行很多调整。 某些图形适配器甚至将图像存储在单独的颜色平面中,而不是单个多通道颜色平面。 当时没有“正确”的答案。

RGBQUADs来自BMP格式,正如Raymond Chen在评论中提到的那样,来自OS / 2位图格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM