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

LZW bit packing for GIF images in JavaScript

本文关键字:LZW 图像 用于 GIF JavaScript      更新时间:2023-09-26

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

谁能给我指个正确的方向?

GIF以"位流"的形式将数据打包到文件中——例如,前9位值的前8位进入一个字节,最后一位进入第二个字节;第二个9位的值填充了第二个字节的其余部分和第三个字节的两位,以此类推。