我在理解如何为.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像素有点难以阅读。
我是否缺少一些基本的东西?感谢您抽出宝贵时间与我一起研究这个问题。
答案 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