用于JavaScript中的GIF图像的LZW位打包

时间:2011-09-02 06:53:54

标签: javascript compression lzw

我正在开发一个可以生成动画GIF图像的JavaScript应用程序。 GIF图像使用LZW压缩算法,因此我需要在JavaScript中实现它。

到目前为止,我有this code可以将字符串(二进制或不二进制)压缩为整数数组,然后将其解压缩。请参阅完整代码的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位边界上。

我经历了Wikipedia's article on Lempel-Ziv-Welch,似乎for GIF image data,我总是将压缩模式的最低有效位与一个字节的最低有效位对齐;但是我尝试了它并且我的GIF不起作用,并且GIF解析器不是非常明确的失败,所以我不确定它是否是因为压缩或其他原因。对我而言,它看起来也是一个巨大的浪费,所以它只会使这种方法更加可疑。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

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