Я работаю над приложением 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-парсеры не очень четко описывают сбои, поэтому я не уверен, что это из-за сжатия или чего-то еще.Для меня это также выглядит как огромная трата битов, так что это только делает подход более сомнительным.
Кто-нибудь может указать мне правильное направление?