LZW
来源:互联网 发布:衡水淘宝摄影 编辑:程序博客网 时间:2024/06/06 18:34
LZW编码
(A)下面给出GIF-LZW编码的编码过程。它的示意代码如下所示:
//初始化字串表
InitializeStringTable();
//输出LZW_CLEAR
WriteCode(LZW_CLEAR);
//初始化保留字串Ω为空
Ω=NULL;
//对输入的每个字符循环操作
For each character in the input stream
{//获取下一个字符串
K=GetNextCharacter();
//判断Ω+k是否在字串表中
If Ω+k is in string table
{//将Ω赋值为Ω+k;
Ω=Ω+k;}
else
{//Ω+k不在字串表中
//输出字符串Ω的编码
WriteCode(CodeFormString(Ω));
//将Ω添加到字串表中
AddTabEntry(Ω);
//将Ω赋值为k
Ω=k;
}
}
//输出字符串Ω的编码
WriteCode(CodeFormString(Ω));
//输出结束标志
WriteCode(LZW_EOI);
通过一个示例说明上述编码过程。假设有一个长度为9的输入字符串:BBBCCBBAA,其编码过程如下:
首先,字串表初始化为:
表1
索引
值
0x000
0x000
0x001
0x000
0x002
0x000
0x003
0x000
……
……
0x041
0x041 (A)
0x042
0x041 (B)
0x043
0x041 (C)
0x044
0x041 (D)
……
……
0x0FE
0x0FE
0x0FF
0x0FF
0x100
LZW_CLEAR
0x101
LZW_EOI
按照上面的流程,首先应该输出LZW_CLEAR的编码(即LZW_CLEAR在字串表中的索引0x100),并初始化保留字符串Ω为空。
接着读出下一个字符“B”。因为Ω+B=B已经存在于字符串中,因此本步将不输出任何编码,而只是将Ω赋值为“B”。
接着读入下一个字符“B”。因为字串表中不存在字符串Ω+B=BB,因此输出Ω=B在字串表中的编码(索引)0x042,并将Ω赋值为新读入的字符“B”,同时现字串表尾部中添加一个字串“BB”,其索引为0x102。
接着读入第4个字符“C”。因为字串表中不存在字符串Ω+C=BBC,因此输出Ω=C在字串表中的编码(索引)0x102,并将Ω赋值为新读入的字符“C”,同时现字串表尾部中添加一个字串“BBC”,其索引为0x103。
接着读入第5个字符“C”。因为字串表中不存在字符串Ω+C=CC,因此输出Ω=C在字串表中的编码(索引)0x043,并将Ω赋值为新读入的字符“C”,同时现字串表尾部中添加一个字串“CC”,其索引为0x104。
接着读入第6个字符“B”。因为字串表中不存在字符串Ω+B=CB,因此输出Ω=C在字串表中的编码(索引)0x043,并将Ω赋值为新读入的字符“B”,同时现字串表尾部中添加一个字串“CB”,其索引为0x105。
接着读入第7个字符“B”。因为Ω+B=BB已经存在于字串表中,因此本步将不输出任何编码,而只是将Ω赋值为“BB”。
接着读入第8个字符“A”。因为字串表中不存在字符串Ω+A=BBA,因此输出Ω=BB在字串表中的编码(索引)0x102,并将Ω赋值为新读入的字符“A”,同时现字串表尾部中添加一个字串“BBA”,其索引为0x106。
接着读入第9个字符“A”。因为字串表中不存在字符串Ω+A=AA,因此输出Ω=A在字串表中的编码(索引)0x041,并将Ω赋值为新读入的字符“A”,同时现字串表尾部中添加一个字串“AA”,其索引为0x107。
现在输入字符串全部读完,直接输出Ω=A在字串表中的编码(索引)0x41。
然后在输出LZW_EOI的编码0x101,编码完成。下表列出上述完整的编码过程。
表2
输入数据
输出结果
保留字符串值
添加的字串及其在字串表中的索引
0x100
Ω=NULL
B
Ω=B
B
0x042
Ω=B
0x102 BB
B
Ω=BB
C
0x102
Ω=C
0x103 BCB
C
0x043
Ω=C
0x104 CC
B
0x043
Ω=B
0x105 CB
B
Ω=BB
A
0x102
Ω=A
0x106 BBA
A
0x041
Ω=A
0x107 AA
0x041
0x101
(B) 下面给出GIF-LZW编码的解码过程,它的示意代码如下所示:
//依次处理每个编码
While ((Code=GetNextCode())!=LZW_EOI)
{//判断是否是LZW_CLEAR
If (Code ==LZW_CLEAR);
{//初始化字串表
InitializeStringTable();
//获取下一个编码
Code=GetNextCode();
//判断是否是LZW_CLEAR
If (Code !=LZW_CLEAR);
{//输出编码对应的字符串
WriteString(StringFormCode(Code));
//更新OldCode
OldCode=Code;
}
}
else
{//判断字串表中是否存在该Code
If (IsInTable(Code))
{//在字串表中
//输出编码对应的字符串
WriteString(StringFormCode(Code));
//添加字符串入字串表
AddStringToTable(StringFormCode(OldCode)+GetFirstChar(StringFormCode(Code)));
//更新OldCode
OldCode=Code;
}
Else
{//不在字串表中
//计算输出字符串
OutString=StringFormCode(OldCode)+GetFirstChar(StringFormCode(OldCode));
//输出字符串
WriteString(OutString);
//添加字符串入字串表
AddStringToTable(OutString);
//更新OldCode
OldCode=Code;
}
}
}
首先读取第一个编码Code=0x100,由于Code为LZW_CLEAR,因此要对字串表进行初始化。初始化结果如表1所示。接着在读取下一个编码Code=0x042,它不等于LZW_CLEAR,因此输出该编码对应的字符串“B”,同时更新OldCode为Code(OldCode=0x042).
读取下一个(第3个)编码Code=0x102,由于该编码对应的字符串还没有生成(IsInTable(Code)返回False),需要先生成该字符串OutString::等于OldCode对应的字符串(B)加上该字符串的第一个字符,因此Outstring=BB.输出该字符串,同时将该字符串BB添加到字符串中(其索引为0x102),更新OldCode为Code(OldCode=0x102)。
读取下一个(第4个)编码Code=0x043它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“C”然后将OldCode对应的字符串(BB)加上该字符串第一个字符(C)添加到字串表中(字符串BBC,其索引为0x103),同时更新OldCode为Code(OldCode=0x043)。
读取下一个(第5个)编码Code=0x043它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“C”然后将OldCode对应的字符串(C)加上该字符串第一个字符(C)添加到字串表中(字符串CC,其索引为0x104),同时更新OldCode为Code(OldCode=0x043)。
读取下一个(第6个)编码Code=0x012它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“BB”然后将OldCode对应的字符串(C)加上该字符串第一个字符(B)添加到字串表中(字符串CB,其索引为0x105),同时更新OldCode为Code(OldCode=0x102)。
读取下一个(第7个)编码Code=0x041它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“A”然后将OldCode对应的字符串(BB)加上该字符串第一个字符(A)添加到字串表中(字符串BBC,其索引为0x106),同时更新OldCode为Code(OldCode=0x041)。
读取下一个(第8个)编码Code=0x041它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“A”然后将OldCode对应的字符串(A)加上该字符串第一个字符(A)添加到字串表中(字符串AA,其索引为0x107),同时更新OldCode为Code(OldCode=0x041)。
读取最后一个(第9个)编码Code=0x101,它等于LZW_EOI,表明数据已经完全解码,结束循环。其解码过程如下:
表3
输入数据
输出数据
保留编码值
添加的字串及其在字串表中的索引
0x100
0x042
B
OldCode=0x041
0x102
BB
OldCode=0x102
0x102 BB
0x043
C
OldCode=0x043
0x103 BBC
0x043
C
OldCode=0x043
0x104 CC
0x102
BB
OldCode=0x102
0x105 CB
0x041
A
OldCode=0x041
0x106 BBA
0x041
A
OldCode=0x041
0x107 AA
0x101
- LZW
- LZW理解
- LZW编码
- LZW编码
- LZW算法
- LZW编码
- [转] LZW
- GIF LZW数据分析
- LZW Data Compression
- LZW压缩算法
- lzw压缩算法
- LZW压缩编码
- lzw 压缩算法源代码
- LZW网页判重
- LZW压缩算法源代码
- lzw图像压缩算法
- LZW 压缩算法
- 压缩算法-LZW
- gdi+实现多种统计图表(饼状,折线,柱状)支持负坐标
- Ajax学习 网址备忘录[转载]
- 男生必看的10部漫画
- 远(far)指针
- 大苦与至苦
- LZW
- 最简单的无缝滚动程序,只需要五行代码(转)
- web报表的匿名访问 reportservice
- 利用XML实现通用WEB报表打印(实现篇)
- 轻松娱乐一下(一组难得一见的好图喔)!
- Encoding 类
- Ajax与Atlas开发笔记
- O'Reilly总裁提姆-奥莱理:什么是Web 2.0
- VB 调用 DAO 与 ACCESS 里面的VBA编程的DAO交互使用详解