RGB到BGR C++宏的说明

Vis*_*iva -1 c++ macros

#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
Run Code Online (Sandbox Code Playgroud)

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

In *_*ico 11

颜色通常由32位整数表示.32位整数可以容纳4个8位字节.其中三个用于保存红色,绿色和蓝色信息.剩下的字节要么未使用,要么用于保存透明度信息.

哪个字节表示哪种颜色未标准化.有些API期望像这样的字节:

(MSB) ******** rrrrrrrr gggggggg bbbbbbbb (LSB)
Run Code Online (Sandbox Code Playgroud)

哪个是"RGB"布局,也许是最常见的形式.在上面的示例中,最重要的8位是"不关心"位,即,没有使用的位.最低有效8位存储蓝色信息.

一些API期望3色字节的反转,如下所示:

(MSB) ******** bbbbbbbb gggggggg rrrrrrrr (LSB)
Run Code Online (Sandbox Code Playgroud)

哪个是"BGR"布局.

宏有助于使用按位运算符互换两个布局.我们来看看它的定义:

(a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) |
(a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
Run Code Online (Sandbox Code Playgroud)

假设我们有一种颜色,矢车菊蓝,其值为0x93CCEA.在RGB布局中,它具有以下位模式:

a_ulColor = 00000000 10010011 11001100 11101010
Run Code Online (Sandbox Code Playgroud)

以下表达式为您提供以下模式:

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
Run Code Online (Sandbox Code Playgroud)

注意到我们只是提取单个字节.表达式#1提取最重要的8位,而表达式#4提取最不重要的8位.我们可以通过做到这一点AND位运算.

现在,要将RGB转换为BGR,我们必须通过位移来向左或向右移动一些位.像这样:

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 
Run Code Online (Sandbox Code Playgroud)

表达式a >> 16只是将位向右移位16位.a << 16将位向左移位16位.

然后,当你们OR在一起时,你得到了这个:

00000000 11101010 11001100 10010011
Run Code Online (Sandbox Code Playgroud)

将结果与原始位模式进行比较:

00000000 11101010 11001100 10010011
00000000 10010011 11001100 11101010
Run Code Online (Sandbox Code Playgroud)

您可以看到第2个和第4个字节是交换的.这就是所有的宏.