Объяснение макроса RGB в BGR C ++ - PullRequest
0 голосов
/ 08 января 2012
#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)

Не могли бы вы объяснить мне значение этого макроса?

Ответы [ 4 ]

10 голосов
/ 08 января 2012

Цвета обычно представлены 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-й байты поменялись местами. Вот и все, что делает макрос.

2 голосов
/ 08 января 2012

Он принимает четырехбайтовое целочисленное значение AA BB CC DD и возвращает значение AA DD CC BB. Вы можете видеть, что первый и третий байты остаются неизменными, в то время как второй байт перемещается на два байта вниз (>> 16), а четвертый - на два (<< 16).

0 голосов
/ 08 января 2012

a_ulColor - это 32-битное RGB-представление (например, пикселя или растрового изображения).Макрос конвертирует его в макет BGR.Он эффективно создает новое значение, меняя значения красного и синего компонентов.

0 голосов
/ 08 января 2012

Меняет порядок элементов RGB байтового размера с RGB на BGR (и наоборот, если честно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...