我正在开发一个可以生成动画 GIF 图像的 JavaScript 应用程序。GIF 图像使用 LZW 压缩算法,因此我需要在 JavaScript 中实现它。
到目前为止,我已经得到了可以将字符串(二进制或非二进制)压缩为整数数组,然后解压缩的代码。请参阅 pastebin 链接以获取完整代码(如果您认为有必要),但这是我运行此代码段的内容,它应该证明压缩和解压缩本身可以正常工作:
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 位边界上。
我浏览了维基百科关于 Lempel-Ziv-Welch 的文章,似乎对于 GIF 图像数据,我总是将压缩模式的最低有效位与一个字节的最低有效位对齐;但我试过了,我的 GIF 不工作,而且 GIF 解析器对失败不是很明确,所以我不确定是因为压缩还是其他原因。对我来说,这看起来也是一种巨大的浪费,所以它只会让这种方法更加可疑。
谁能指出我正确的方向?