LZW 编码和 GIF 文件格式
LZW encoding and the GIF file format
我正在尝试了解如何在C++中创建.gif
文件。到目前为止,我想我了解了除LZW
编码如何工作之外的所有内容。这是我用标签生成的文件:
47 49 46 38 39 61 -header
0A 00 01 00 91 00 -logical screen descriptor
00 00 FF 00 FF 00 -color table [green,red,yellow,black]
00 FF FF 00 00 00
00 21 F9 04 00 00 -graphics control extension
00 00 00 2C 00 00 -image descriptor
00 00 0A 00 01 00 -(10 pixels wide x 1 pixel tall)
00 02 04 8A 05 00 -encoded image
3B -terminator
这里再次没有用于复制/粘贴目的的标签:47 49 46 38 39 61 05
00 04 00 91 00 00 00 FF 00 FF 00 00 00 FF 00 00 00 21 F9 04 00 00 00 00 00 2C 00 00 00 00 0A 00 01 00 00 02 04 8A 05 00 3B我在理解02 04 8A 05
如何转换为图像yryryggyry
时遇到了很多麻烦。我知道02
是最小代码大小,04
是图像块的长度,我想我已经确定了清晰和EOI
的代码,但我不明白两者之间的代码。
8A 05
10001010 00000101
100|01010 00000|101
^ ???? ^
clear code EOI code
到目前为止,我从.gif
规范中获得了最多的信息:http://www.w3.org/Graphics/GIF/spec-gif89a.txt
这个网站也很有帮助:http://www.matthewflickinger.com/lab/whatsinagif/lzw_image_data.asp
谢谢
编辑*
我观看了评论中链接的 Youtube 视频,并为颜色流"yryryggyry"手动编码了图像:
Color table-012=gry
2 1 2 1 2 0 0 2 1 2
010 001 010 001 010 000 000 010 001 010
current next output dict
010 001 010 21 6
001 010 001 12 7
010 001 - -
001 010 110 121 8
010 000 010 212 9
000 000 000 00 10
000 010 1010 002 11
010 001 - -
001 010 110 -
010 - 010 -
outputs-100 010 001 110 010 000 1010 110 010 101
01010101 4th 55
10101000 3rd A8
00101100 2nd 2C
01010100 1st 54
Code-54 2C A8 55
我一定犯了一个错误,因为这段代码生成图像"yr"而不是"yryryggyry"
我将尝试重做工作,看看我是否得到不同的答案
也许您在第 4 行犯了一个错误: 001 010 110 121 8
在第 3 行,"010"被忽略,因此您必须先将其添加到第 4 行。在第 4 行,它涉及:
current next output dict
010 001 010 010 001 212 8
这是我的解决方案(也是手动创建的):
LZW for yryryggyry
更新:
终于想通了原因:
对数据进行编码时,只要写出等于 2^(当前代码大小)-1 的代码,就会增加代码大小。如果要从代码解码到索引,则需要在将等于 2^(当前代码大小)-1 的代码值添加到代码表后立即增加代码大小。也就是说,下次你抓住下一段位时,你再抓住一个。
作者的意思是,当你要输出 2^(当前代码大小)-1 时,你应该增加你的字大小,但可能有不同的解释,这似乎是合理的:
将 #(2 ^ 当前代码大小) 项添加到代码表时,下一个输出应增加其字大小。
在作者的例子中也是正确的,这是我更喜欢的解释。
这是你的例子("yryryggyry"):
output sequence:
#4 #2 #1 #6 #2 #0 #0 #8 #5
当您即将输出 #6 时,将"yry"添加到代码表中,该代码表的索引为 #8。
由于 8 = 2 ^ 当前字大小
(current word size = 2(original) + 1(reserved) = 3)
下一个输出应该增加字大小,所以 #2 变成一个 4 位的字。
最终的输出序列是:
4 100
2 010
1 001
6 110
2 0010
0 0000
0 0000
8 1000
5 0101
编码后,它们成为
54 2C 00 58
所以数据块是
02 -minimum word size
04 -data length
54 2c 00 58 -data
00 -data block terminator
- 文件格式的编写解释器(C++ Arduino)
- 如何使用 lldb 在曼扎罗中调试 lz4 文件格式的核心转储?
- Assimp - 如何使用任何文件格式导入带有纹理的网格?
- boost::p rogram_options 配置文件格式
- 如何启用libMagick++以保存.png文件格式
- 生成库失败:无法识别文件格式;作为链接器脚本处理
- 有没有更好的方法来使用比特流解码文件格式?
- MySQL C++连接器:添加符号时出错:文件格式无法识别
- Qt解析自定义文件格式
- ADTF 录制文件格式
- /usr/bin/ld找不到标头:未识别的文件格式
- C 库从3D文件格式(例如STL)获得常规网格
- 随机访问文件格式,用于分层组织的二进制文件和文本文件
- C OPENCV 3.4 / FFMPEG 3.4.1 VIDEOWRITER和MP4输出文件格式
- 具有挑战性的数据文件格式,需要将其读取为包含类对象的数组的VAR
- GDB错误不以可执行格式:未识别的文件格式
- 如何获取 C++/Qt 格式的文件格式
- GetText PO文件格式
- 如何在 c++ 中从".in"格式的文件中获取输入?此代码进入无限循环,但适用于".txt"文件格式
- 用于将三维模型导入OpenGL/C++项目的推荐文件格式和图形库