RGB到BGR C ++宏的说明

时间:2012-01-07 22:30:59

标签: c++ macros

#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)

你能告诉我这个宏的含义吗?

4 个答案:

答案 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布局。它通过交换红色和蓝色组件值有效地产生新值。