3

我正在开发一个可以生成动画 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 解析器对失败不是很明确,所以我不确定是因为压缩还是其他原因。对我来说,这看起来也是一种巨大的浪费,所以它只会让这种方法更加可疑。

谁能指出我正确的方向?

4

1 回答 1

1

GIF 将数据作为“位流”打包到文件中——例如,前 9 位值的前 8 位进入一个字节,最后一位进入第二个字节;第二个 9 位值填充第二个字节的其余部分和第三个字节的两位,依此类推。计划大量的位移。

于 2011-09-02T07:10:05.403 回答