#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
你能告诉我这个宏的含义吗?
答案 0 :(得分:10)
颜色通常由32位整数表示。 32位整数可以容纳4个8位字节。其中三个用于保存红色,绿色和蓝色信息。剩下的字节要么未使用,要么用于保存透明度信息。
哪个字节表示哪种颜色未标准化。有些API期望像这样的字节:
(MSB) ******** rrrrrrrr gggggggg bbbbbbbb (LSB)
哪种是“RGB”布局,也许是最常见的形式。在上面的示例中,最重要的8位是“不关心”位,即,没有使用的位。最低有效8位存储蓝色信息。
有些API期望3色字节的反转,如下所示:
(MSB) ******** bbbbbbbb gggggggg rrrrrrrr (LSB)
哪个是“BGR”布局。
宏有助于使用按位运算符互换两个布局。我们来看看它的定义:
(a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) |
(a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
假设我们有一个颜色Cornflower Blue,其值为0x93CCEA。在RGB布局中,它具有以下位模式:
a_ulColor = 00000000 10010011 11001100 11101010
以下表达式为您提供以下模式:
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
注意到我们只是提取单个字节。表达式#1提取最重要的8位,而表达式#4提取最不重要的8位。我们可以通过the AND
bitwise operation完成此操作。
现在,要将RGB转换为BGR,我们必须通过bitshifts向左或向右移动一些位。像这样:
1. (a_ulColor & 0xFF000000) --> 00000000 00000000 00000000 00000000
2. (a_ulColor & 0xFF0000) >> 16 --> 00000000 00000000 00000000 10010011
3. (a_ulColor & 0x00FF00) --> 00000000 00000000 11001100 00000000
4. (a_ulColor & 0x0000FF) << 16 --> 00000000 11101010 00000000 00000000
表达式a >> 16
只是将位向右移位16位。 a << 16
将位向左移位16位。
然后,当你OR
将它们放在一起时,你得到了这个:
00000000 11101010 11001100 10010011
将结果与原始位模式进行比较:
00000000 11101010 11001100 10010011
00000000 10010011 11001100 11101010
您可以看到交换了第2个和第4个字节。这就是所有的宏。
答案 1 :(得分:2)
它需要一个四字节的整数值AA BB CC DD
,并返回值AA DD CC BB
。您可以看到第一个和第三个字节保持不变,而第二个字节向下移动两个字节(>> 16
),第四个字节向上移动两个(<< 16
)。
答案 2 :(得分:0)
它将字节大小的RGB元素从RGB转换为BGR(反之亦然)。
答案 3 :(得分:0)
a_ulColor
是32位RGB表示(例如像素或位图)。宏将其转换为BGR布局。它通过交换红色和蓝色组件值有效地产生新值。