【问题标题】:How do you compress image data for LZW encoding for .GIF files?如何为 .GIF 文件压缩 LZW 编码的图像数据?
【发布时间】:2019-05-04 08:26:33
【问题描述】:

我无法理解如何为 .gif 文件压缩 89a specification 的图像数据。例如,我正在尝试制作 3x2 .GIF。让我构建一个示例颜色代码表并通过一个示例 [我认为是正确的]。

Color code | Color
------------------
0          | Brown
1          | Red
2          | Green
3          | Black

我要创建的图像是这个。

3x2 pixels (6 pixels total)
----------
Br Br Br
Br R  Br

使用 LZW 压缩会引导我完成这个过程。这是我得到的最终代码表。

Code table
----------
# | code
0 | 0
1 | 1
2 | 2
3 | 3
4 | clear
5 | eoi // end of information
6 | 0 0
7 | 0 0 0
8 | 0 1
9 | 1 0

最终值为4 0 6 0 1 0 5,这是我的代码。因为我写了一个代码0 0 0,这个代码值等于7,所以我不得不将我的代码大小从3> 4位增加到后续代码。所以,这是我的图像数据的字节(来自我的代码表)。

100  - 4
000  - 0
110  - 6
0000 - 0
0001 - 1
0000 - 0
0101 - 5

我最终将我的图像数据编码为

10000100 - 132
00100001 - 33
10100000 - 160
00000000 - 0

最终在我的最终 .gif 文件中看起来像这样(我在与图像数据对应的值周围加上了括号)

47 49 46 38 39 61 03 00 02 00 f1 00 00 b9 7a 56    
ff 00 00 00 ff 00 00 00 00 21 ff 0b 4e 45 54 53 
43 41 50 45 32 2e 30 03 01 ff ff 00 21 f9 04 04 
64 00 00 00 2c 00 00 00 00 03 00 02 00 00 [02 04     
84 21 a0 00 00] 3b 

// Explanation
02 - Minimum LZW code size
04 - Data sub-block of 4 bytes
84 - 132 in decimal
21 - 33 in decimal
a0 - 160 in decimal
00 - 0 in decimal
00 - Termination byte

我的图像看起来像这样(为什么这里是绿色而不是红色?)。因为 2x3 像素有点难以阅读,所以我把图片搞砸了。

我缺少一些基本的东西吗?感谢您抽出宝贵时间和我一起研究这个问题。

【问题讨论】:

    标签: gif lzw


    【解决方案1】:

    发现错误,在于压缩LZW图像数据时的代码大小。

    当您在使用 LZW 压缩图像数据时创建代码表时,当您添加等于 2^(代码大小)的代码时,您需要增加代码大小。所以,不是在添加代码7 | 0 0 0(如上表所示)后将代码大小增加一,而是在添加 8 | 0 1 后将代码大小增加一(因为 8 = 2^(code size = = 3))。

    这是通过增加代码大小来改变图像数据的方式

    100  - 4
    000  - 0
    110  - 6
    000  - 0
    0001 - 1
    0000 - 0
    0101 - 5
    

    然后,生成的图像数据字节如何变化。

    10000100 - 132
    00010001 - 17
    01010000 - 80
    

    我在数据周围加上了括号,以显示与完整 .gif 数据的比较,以显示发生了什么变化(在应用修复后)。这是与上面相同的 .gif 文件。

    47 49 46 38 39 61 03 00 02 00 f1 00 00 b9 7a 56 
    ff 00 00 00 ff 00 00 00 00 21 ff 0b 4e 45 54 53
    43 41 50 45 32 2e 30 03 01 ff ff 00 21 f9 04 04
    64 00 00 00 2c 00 00 00 00 03 00 02 00 00 [02 03
    84 11 50 00] 3b 
    
    // Explanation
    02 - Minimum LZW code size
    03 - Data sub-block of 3 bytes
    84 - 132 in decimal
    11 - 17 in decimal
    50 - 80 in decimal
    00 - Termination byte
    

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多