首先是lzw算法
LZW 压缩算法是基于字典的压缩算法。 LZW 是 Lempel、Ziv、Welch 三人的首字母缩写。
该算法由 Lempel、Ziv 于 1977 年发明,Welch 于 1984 年改进。1987 年用于 GIF87a
的图象压缩编码中。
字典可以是静态的,也可以是动态的。动态的字典不占用额外的字典空间,一次扫描即
可动态生成。LZW 算法有很多变种及实现方法,这里讲的便是用于 GIF 图象压缩的静态
LZW 压缩算法。
字典树的概念--森林的数据结构表示。
森林即是树的表,而树又采用二叉树来表示。其右结点为邻居关系,左结点为父子关系。
字(Character)/符号(Symbol)与词(Word)的概念。
字即是原始信息流中重复出现的基本单位。其字空间可用相应位数的 bit 编码,这个位
数即字位长(SBC)。如文本中的字节为 8 bit,32 色图象的像素字位长为 5 bit 等。
词即是经常重复的字的一个序列。因为字很少单独出现,因此可牺牲一个位长(SBC+1)表
示单独的字,而获得一倍的词编码空间(2^(SBC+1)),而词最少是两个字。以此换取空间
的整体节省。
字编码 < 2^SBC;词编码 > EIC;并且 < 2^MCS 否则编码位长加一,以使字典空间加倍
扩容。
字典树的大小(index_dic_max)。其容量一般为 4K。
字典越大,其可表示的空间越大,但相应的系统开销也会变大,要权衡利弊。
一般的大小为 4K,较为合适。即 12 位的最大编码长度,4K=2^12。
几个编码尺寸的概念及其数量关系:
符号或字的位长(Symbol Bit Counter)。SBC = 2,4,8 分别对应黑白、16色、256色的图象。注意,该值不完全是色的位数。
最小编码尺寸(Minimum Code Size)。MCS = SBC+1
清除/初始化码(Clear/Initialization Code)。CIC = 2^SBC
结束码(End of Information Code)。EIC = CIC+1
第一可用的词编码(First Available Code)。FAC = CIC+2
变长编码(Variable-Length-Code)的原理。字典是随着新词的出现而动态生成与扩张的。
第一个字作为当前词(current_node)的首字,第二个字与第一个字组成的词为第一个词,
其编码为 FAC;同时把第一个字写入输出流,第二个字作为当前词首字。依此,循环往复。
初始化字典;往输出流写入“初始码 CIC”。
从输入流读下一个字 Symbol。若流结束转第 9 步。
发现 Symbol 为新字(其左右指针皆为空),自然与前面的当前词组成新词,转第 5 步。
发现 Symbol 为老字(其左指针不为空),若为老词,转第 2 步。
发现新词加入字典(字典容量加一),并把此前的老词的编码写入输出流,并把 Symbol
作为当前词的首字。
如果基于现有码长的字典已满(index_dic=2^CS),则码长加一,字典扩容,容量随之加倍。
如果字典达到设定的最大容量则在输出流中插入“清除码 CIC”,则字典与压缩过程又恢
复其最少码长状态,码长(CS)为最少码长(MCS)。转第 2 步。
当前字典尺寸(index_dic)加一,转第 2 步。
当编码完成时,以“结束码 EIC”结束输出流。压缩过程结束。
压缩算法论文及源码可参看:http://www.cs.pdx.edu/~idr/compression
图象格式可参看:http://www.cs.wpi.edu/~matt/courses/cs563/talks/gformats.html