#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个字节是交换的.这就是所有的宏.
| 归档时间: |
|
| 查看次数: |
4188 次 |
| 最近记录: |