Сжатие / упаковка битов "пофиг" в 3 состояния - PullRequest
3 голосов
/ 21 августа 2010

В данный момент я работаю над проектом на экране с черными, белыми и прозрачными пикселями. (Это проект с открытым исходным кодом: http://code.google.com/p/super-osd;, который показывает OSD с набором пикселей 256x192 в процессе разработки, но я перехожу на OSD белого / черного / прозрачного цвета.)

Поскольку каждый пиксель является черным, белым или прозрачным, я могу использовать простую кодировку состояния 2 бит / 4, где я сохраняю выделение черно-белого и выделение прозрачного. Таким образом, у меня была бы таблица истинности как это (x = не волнует):

B/W  T      
 x   0    pixel is transparent
 0   1    pixel is black
 1   1    pixel is white

Однако, как ясно видно, это теряет один бит, когда пиксель прозрачен. Я разрабатываю микроконтроллер с ограниченным объемом памяти, поэтому, когда я могу сохранить память, это хорошо.

Итак, я пытаюсь придумать способ упаковать эти 3 состояния в какой-то более крупный блок (скажем, в байт). Я открыт для использования таблиц поиска для декодирования и кодирования данных, поэтому можно использовать сложный алгоритм , но он не может зависеть от состояний пикселей до или после текущей единицы / байта (это исключает любой правильный алгоритм сжатия данных), а размер должен быть согласованным; то есть сцена со всеми прозрачными пикселями должна быть такой же, как сцена со случайным шумом. Я представлял что-то на уровне плотно упакованного десятичного числа, которое упаковывает 3 x 4-битных (0-9) числа BCD только в 10 битов с чем-то вроде 24 состояний, остающихся из 1024, и это здорово. Так у кого-нибудь есть идеи?

Есть предложения? Спасибо!

1 Ответ

3 голосов
/ 21 августа 2010

В байте (256 возможных значений) вы можете хранить 5 ваших трехбитных значений.Один способ взглянуть на это: от трех до пятой степени - 243, чуть меньше 256. Тот факт, что это немного меньше, также показывает, что вы не тратите большую часть доли (вряд ли, либо).

Для кодирования пяти ваших 3-битных «цифр» в байт, подумайте о том, чтобы взять число в базе 3 из пяти последовательных «цифр» подряд - результирующее значение гарантированобыть меньше 243 и, следовательно, может быть напрямую сохранено в байте.Аналогично, для декодирования выполните преобразование байта в значение base3.

...