C++ 向BGR C&x2B解释RGB+;宏 定义RGB2BGR(a_ulColor)(a_ulColor&0xFF000000)|((a_ulColor&0xFF0000)>>16)|(a_ulColor&0x00FF00)|((a_ulColor&0x0000FF)
它将字节大小的RGB元素的顺序从RGB交换到BGR(公平地说,反之亦然)。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位字节。其中三个用于保存红色、绿色和蓝色信息。剩余的字节要么未使用,要么
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个字节被交换。这就是宏所做的一切。该宏相对来说是微不足道的。无论如何,您应该尝试自己更好地理解它,或者更详细地解释您不理解的地方。