Преобразование двухбитового цвета в восьмибитный цвет

У меня значения цвета представлены шестью битами, по два бита для красного, зеленого и синего цветов. Таким образом, черный будет представлен как двоичный 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 (значение, найденное методом проб и ошибок), цвета совпадают почти идеально.


person Amarghosh    schedule 12.05.2011    source источник
comment
Вы имеете в виду , когда множитель 85, возможно, заменят на 84?   -  person Paul R    schedule 12.05.2011
comment
@ Пол Нет, я действительно имел в виду сорок восемь.   -  person Amarghosh    schedule 12.05.2011
comment
@Amarghosh: Хорошо - это кажется очень большой разницей по сравнению с 85 - как может совпадение быть достаточно близким с FACTOR = 85 и почти идеальным с FACTOR = 48, интересно?   -  person Paul R    schedule 12.05.2011
comment
@ Пол - Я предполагаю, что он имел в виду визуально. Очевидно, что для двух нулевых битов не имеет значения, какое отображение вы используете, поэтому чем темнее цвета, тем ближе соответствие любому используемому значению. Почти любое монотонное разумное отображение будет довольно близко   -  person Nick Fortescue    schedule 12.05.2011
comment
@Nick: ах, хорошо - это может иметь смысл - похоже, первое, что нужно сделать OP, - это разработать лучший способ тестирования / проверки результата.   -  person Paul R    schedule 12.05.2011
comment
@Nick Я имел в виду визуальное сопоставление, извините, если я не разъяснил. Это справочное видео - единственное, что нам нужно для проверки цветов. Использование 48 в качестве коэффициента делает тускло-белый (101010) серым (0x606060) вместо 0xAAAAAA, и эта разница значительна. Короче говоря, 48 подходит для эталонного видео, но не работает с обычным, тогда как 85 работает везде, но не работает с эталонным видео.   -  person Amarghosh    schedule 12.05.2011
comment
Если это так, невозможно иметь какой-либо алгоритм, который давал бы разные результаты в зависимости от того, является ли это эталонным видео или нормальным, если я вас неправильно понял.   -  person Nick Fortescue    schedule 12.05.2011


Ответы (1)


Единственный известный мне стандарт - это EGA - есть ссылка на wikipedia.

Как бы то ни было, 6 бит - это очень мало места - всего 64 значения. Самый быстрый способ выполнить преобразование с точки зрения времени процессора и памяти - это почти наверняка просто найти значение в массиве размером 64. Это очень просто, особенно если у вас есть тестовые данные - просто введите правильные 64 значения из тестовые данные в массиве. Таким образом, вам не нужно беспокоиться о том, является ли это стандартом - стандарт - это то, что работает для этой системы.

person Nick Fortescue    schedule 12.05.2011
comment
Цветовые биты действительно поступают как RrGgBb; На всякий случай я попробовал формат EGA для rgbRGB, и он дал мне совершенно разные цвета, в отличие от ближайших совпадений, которые я получаю сейчас. - person Amarghosh; 12.05.2011
comment
Хорошо, но мой комментарий о массиве все еще в силе. Имеет ли это смысл для вас? - person Nick Fortescue; 12.05.2011
comment
Да, я получил его. Я надеялся, что есть стандартный алгоритм (может быть, он учитывает каждый из трех компонентов для вычисления 8-битного значения отдельного компонента); Таблица поиска определенно поможет с точки зрения производительности - спасибо за предложение. - person Amarghosh; 12.05.2011