Обратная операция, включающая побитовые операторы SHIFT и AND - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок в C. У меня есть функция, которая преобразует три unsigned char или uint8_t (r, g и b), каждый из которых представляет значение цвета для красного, синего и зеленого соответственно. У меня есть функция, которая конвертирует их в формат R5B6G5. Этот формат используется для хранения цвета 16-разрядного целого числа без знака. Это означает, что первые (слева) 5 битов хранят значение красного (r), следующие 6 битов для зеленого (g) и последние 5 бит для синего. Функция:

uint16_t R5G6B5(uint8_t r, uint8_t g, uint8_t b) {
    return ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
}

Мой вопрос: как мне вернуть три значения r (красный), g (зеленый) и b (синий) из заданного uint16_t. Насколько я понимаю, я не могу, потому что битовая операция или операция необратима. Но приложение, похоже, может отображать цвета из этого формата, поэтому я предполагаю, что оно каким-то образом способно получить три значения.

Спасибо.

1 Ответ

3 голосов
/ 23 апреля 2020

Ваша функция преобразует RGB888 (это 8 бит для каждого цвета) в RGB565 (6 бит для ЗЕЛЕНОГО и 5 бит для других цветов. Вы не можете восстановить младшие биты, потерянные при преобразовании.

Приложение может быть в состоянии показать изображение, но это менее точное изображение, чем оригинальное. Вы можете выполнить обратное преобразование, но опять же, вы потеряли 2-3 младших бита, поэтому ваше изображение никогда не будет прежним.

Обратное преобразование может быть сделано следующим образом:

uint16_t rgb565 = some value;
uint8_t red = (rgb565 >> 11) << 3;
uint8_t green = ((rgb565 >> 5) << 2) & 0xFF;
uint8_t blue = (rgb565 << 3) & 0xFF;

И да, вам не нужно беспокоиться об операции ИЛИ, потому что в вашем случае операнды никогда не перекрываются, поэтому нет потери, если информация во время ИЛИ операция.

...