У меня значения цвета представлены шестью битами, по два бита для красного, зеленого и синего цветов. Таким образом, черный будет представлен как двоичный 000000, красный 110000, синий 000011, желтый 111100 и так далее.
Мне нужно преобразовать этот цвет в 24-битное значение rgb, чтобы передать его графическому слою (DirectFB). Поскольку три (двоичное 11) должно стать 255 (0xFF), я использовал следующую формулу с 85 (= 255/3) в качестве коэффициента преобразования.
r = (color_6bit >> 4) * FACTOR;
g = ((color_6bit >> 2) & 0x3) * FACTOR;
b = (color_6bit & 0x3) * FACTOR;
color_32bit = (r << 16)| (g << 8) | b;
Это правильно преобразует цвета (белый [0x3F -> 0xFFFFFF], красный [0x30 -> 0xFF0000] и т. Д.).
Теперь эти цвета представляют собой цвета текста и фона подписей, которые будут отображаться на телевизоре, и у нас есть тестовые потоки, которые имеют эталонную цветовую палитру, встроенную в видео. Когда я рисую на экране восьмибитные цвета, полученные с помощью этой формулы, они не совсем соответствуют эталонному цвету, присутствующему в видео - он довольно близок, но есть разница.
Правильно ли я делаю преобразование или есть какой-либо стандартный алгоритм для преобразования двухбитных значений цвета RGB в восьмибитные значения RGB? Может ли DirectFB внутренне использовать какое-то другое представление (например, RGB565)?
Как бы то ни было, когда множитель 85 заменяется на 48 (значение, найденное методом проб и ошибок), цвета совпадают почти идеально.