Как конфертировать из RGB555 в RGB888 в c #? - PullRequest
3 голосов
/ 10 декабря 2010

Мне нужно конвертировать 16-битный XRGB1555 в 24-битный RGB888.Моя функция для этого приведена ниже, но она не идеальна, то есть значение 0b11111 даст значение 248 в качестве значения пикселя, а не 255. Эта функция для little-endian, но ее легко изменить для big-endian.1002 *

Есть идеи, как заставить это работать?

Ответы [ 3 ]

7 голосов
/ 10 декабря 2010

Обычно вы копируете старшие биты в нижние биты, поэтому если бы у вас было пять битов следующим образом:

Bit position: 4 3 2 1 0
Bit variable: A B C D E

Вы бы расширили это до восьми битов как:

Bit position: 7 6 5 4 3 2 1 0
Bit variable: A B C D E A B C

Таким образом, все нули остаются всеми нулями, все становятся всеми единицами, и значения между ними масштабируются соответствующим образом.

(Обратите внимание, что A, B, C и т. Д. Не должны быть шестнадцатеричными цифрами - онипеременные, представляющие один бит).

2 голосов
/ 10 декабря 2010

Я бы пошел с таблицей поиска.Поскольку существует только 32 различных значения, оно даже помещается в строку кэша.

Вы можете получить 8-битное значение из 5-битного значения с помощью: return (x<<3)||(x>>2);

Округление может бытьидеальный хотя.Т.е. результат не всегда ближе всего ко входу, но никогда не бывает дальше, чем 1 / 255.

0 голосов
/ 10 декабря 2010

Начните с написания нескольких тестов:

Color c = XRGB1555(0, 0) => expect c RGB == 0,0,0
Color c = XRGB1555(0xff, 0xff) => expect c RGB == ff,ff,ff.

Остальное последует!

...