C++ 向BGR C&x2B解释RGB+;宏 定义RGB2BGR(a_ulColor)(a_ulColor&0xFF000000)|((a_ulColor&0xFF0000)>>16)|(a_ulColor&0x00FF00)|((a_ulColor&0x0000FF)

C++ 向BGR C&x2B解释RGB+;宏 定义RGB2BGR(a_ulColor)(a_ulColor&0xFF000000)|((a_ulColor&0xFF0000)>>16)|(a_ulColor&0x00FF00)|((a_ulColor&0x0000FF),c++,macros,C++,Macros,它将字节大小的RGB元素的顺序从RGB交换到BGR(公平地说,反之亦然)。a_ulColor是32位RGB表示(例如像素或位图)。宏将其转换为BGR布局。它通过交换红色和蓝色分量值有效地生成一个新值。它接受一个四字节整数值,AA BB CC DD,并返回值AA DD CC BB。您可以看到第一个和第三个字节保持不变,而第二个字节向下移动两个字节s(>16)和第四个被上移两个(颜色通常由32位整数表示。32位整数可以保存四个8位字节。其中三个用于保存红色、绿色和蓝色信息。剩余的字节要么未使用,要么

它将字节大小的RGB元素的顺序从RGB交换到BGR(公平地说,反之亦然)。

a_ulColor
是32位RGB表示(例如像素或位图)。宏将其转换为BGR布局。它通过交换红色和蓝色分量值有效地生成一个新值。

它接受一个四字节整数值,
AA BB CC DD
,并返回值
AA DD CC BB
。您可以看到第一个和第三个字节保持不变,而第二个字节向下移动两个字节s(
>16
)和第四个被上移两个(
颜色通常由32位整数表示。32位整数可以保存四个8位字节。其中三个用于保存红色、绿色和蓝色信息。剩余的字节要么未使用,要么用于保存透明度信息

哪个字节表示哪种颜色未标准化。某些API预期的字节如下:

#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
(MSB) ******** rrrrrrrr gggggggg bbbbbbbb (LSB)
这是“RGB”布局,可能是最常见的形式。在上面的illCleartion中,最重要的8位是“不在乎”位,即未使用的位。最低有效的8位存储蓝色的信息

一些API希望3个颜色字节的颜色相反,如下所示:

#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
(MSB) ******** rrrrrrrr gggggggg bbbbbbbb (LSB)
这是“BGR”布局

宏有助于使用位运算符对两个布局进行互译。让我们看看它的定义:

(MSB) ******** bbbbbbbb gggggggg rrrrrrrr (LSB)
以下表达式提供了以下模式:

a_ulColor = 00000000 10010011 11001100 11101010
注意,我们只是提取单个字节。表达式#1提取最高有效的8位,表达式#4提取最低有效的8位。我们可以通过

现在,要将RGB转换为BGR,我们必须通过将一些位向左或向右移动。如下所示:

1. a_ulColor & 0xFF000000 --> 00000000 00000000 00000000 00000000
2. a_ulColor & 0xFF0000   --> 00000000 10010011 00000000 00000000
3. a_ulColor & 0x00FF00   --> 00000000 00000000 11001100 00000000
4. a_ulColor & 0x0000FF   --> 00000000 00000000 00000000 11101010
将结果与原始位模式进行比较:

(a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) |
(a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
00000000 11101010 11001100 10010011

您可以看到第2个和第4个字节被交换。这就是宏所做的一切。

该宏相对来说是微不足道的。无论如何,您应该尝试自己更好地理解它,或者更详细地解释您不理解的地方。