Упаковка битов LZW для изображений GIF в JavaScript - PullRequest
3 голосов
/ 02 сентября 2011

Я работаю над приложением JavaScript, которое может генерировать анимированные GIF-изображения.GIF-изображения используют алгоритм сжатия LZW, и поэтому мне нужно реализовать его в JavaScript.

Пока у меня есть этот код , который может сжимать строку (двоичную или нет)в массив целых чисел, затем распакуйте его все в порядке.См. Ссылку на вставку для полного кода (если вы считаете, что это необходимо), но вот что я получаю, запустив этот фрагмент, который должен продемонстрировать, что само сжатие и распаковка работает нормально:

var lzw = new LZW(8);
var input = "TOBEORNOTTOBEORTOBEORNOT#";
var compressed = lzw.compress(input);

console.log(input);
// "TOBEORNOTTOBEORTOBEORNOT#"

console.log(compressed);
// [84, 79, 66, 69, 79, 82, 78, 79, 84, 256, 258, 260, 265, 259, 261, 263, 35]

console.log(lzw.decompress(compressed));
// "TOBEORNOTTOBEORTOBEORNOT#"

Проблема,Теперь, я не знаю, как сделать бинарную упаковку.Если я правильно понимаю алгоритм LZW, только первый битовый шаблон из compressed может быть аккуратно помещен на 8-битных границах, остальные должны быть на 9-битных границах.

Я прошел В статье Википедии о Лемпеле-Зиве-Уэлче и, похоже, для данных изображения GIF , я бы всегда совмещал младшие значащие биты сжатого шаблона с наименее значимыми битами байта;но я попробовал это сделать, и мои GIF-файлы не работают, и GIF-парсеры не очень четко описывают сбои, поэтому я не уверен, что это из-за сжатия или чего-то еще.Для меня это также выглядит как огромная трата битов, так что это только делает подход более сомнительным.

Кто-нибудь может указать мне правильное направление?

1 Ответ

1 голос
/ 02 сентября 2011

GIF упаковывает данные в файл как «поток битов» - например, первые восемь битов первого 9-битного значения входят в один байт, а последний бит входит во второй байт; второе 9-битное значение заполняет остаток второго байта и два бита третьего, и так далее. Планируйте много битов.

...