Цвета обычно представлены 32-битным целым числом. 32-разрядные целые числа могут содержать четыре 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)
Допустим, у нас есть цвет Васильковый , который имеет значение 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-битные значения. Мы смогли сделать это с помощью 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
Выражение a >> 16
просто сдвигает биты вправо на 16 бит. a << 16
сдвигает биты влево на 16 бит.
Затем, когда вы OR
все вместе, вы получите это:
00000000 11101010 11001100 10010011
Сравните результат с исходной битовой комбинацией:
00000000 11101010 11001100 10010011
00000000 10010011 11001100 11101010
Вы можете видеть, что 2-й и 4-й байты поменялись местами. Вот и все, что делает макрос.