如何为.GIF文件的LZW编码压缩图像数据?

时间:2018-12-03 03:24:26

标签: gif lzw

我在理解如何为.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像素有点难以阅读。

What the .GIF looks like

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

1 个答案:

答案 0 :(得分:0)

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

在使用LZW压缩图像数据时创建代码表时,在添加等于2 ^(代码大小)的代码时,需要增加代码大小。因此,我不需要在添加代码7 | 0 0 0之后将代码大小增加一(如上表所示),而是需要在添加8 | 0 1之后将代码大小增加一(因为8 = 2 ^ (代码大小== 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