【问题标题】:LZW bit packing for GIF images in JavaScriptJavaScript 中 GIF 图像的 LZW 位打包
【发布时间】:2011-09-02 06:53:53
【问题描述】:

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

到目前为止,我已经有了this code,它可以将字符串(二进制或非二进制)压缩为整数数组,然后解压缩就可以了。查看完整代码的 pastebin 链接(如果您认为有必要),但这是我运行这个 sn-p 的内容,它应该证明压缩和解压缩本身可以正常工作:

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

谁能指出我正确的方向?

【问题讨论】:

    标签: javascript compression lzw


    【解决方案1】:

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

    【讨论】:

    • 我可以承受的效率低于使用位移位时的效率。 :) 考虑到这种溢出,我想最后一个字节将设置其最高有效位(而不是最低有效位)?
    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 2019-05-04
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多