LZW 数据压缩算法的原理分析
我希望通过本文的介绍,能给那些目前不太了解 lzw 算法和该算法在 gif 图像中应用,但渴望了解它的
人一些启发和帮助。抛砖引玉而已,更希望园子里面兄弟提出宝贵的意见。
1.LZW 的全称是什么?
Lempel-Ziv-Welch (LZW).
2. LZW 的简介和压缩原理是什么?
LZW 压缩算法是一种新颖的压缩方法,由 Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。它
采用了一种先进的串表压缩,将每个第一次出现的串放在一个串表中,用一个数字来表示串,压缩文件只
存贮数字,则不存贮串,从而使图象文件的压缩效率得到较大的提高。奇妙的是,不管是在压缩还是在解
压缩的过程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。
LZW 算法中,首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,
这个数字与此字符串在串表中的位置有关,并将这个数字存入压缩文件中,如果这个字符串再次出现时,
即可用表示它的数字来代替,并将这个数字存入文件中。压缩完成后将串表丢弃。如"print" 字符串,如果
在压缩时用 266 表示,只要再次出现,均用 266 表示,并将"print"字符串存入串表中,在图象解码时遇
到数字 266,即可从串表中查出 266 所代表的字符串"print",在解压缩时,串表可以根据压缩数据重新
生成。
3.在详细介绍算法之前,先列出一些与该算法相关的概念和词汇
1)'Character': 字符,一种基础数据元素,在普通文本文件中,它占用 1 个单独的 byte,而在图像中,
它却是 一种代表给定像素颜色的索引值。
2)'CharStream':数据文件中的字符流。
3)'Prefix':前缀。如这个单词的含义一样,代表着在一个字符最直接的前一个字符。一个前缀字符长度
可以为 0,一个 prefix 和一个 character 可以组成一个字符串(string),
4)'Suffix': 后缀,是一个字符,一个字符串可以由(A,B)来组成,A 是前缀,B 是后缀,当 A 长度为 0 的
时候,代表 Root,根
5)'Code:码,用于代表一个字符串的位置编码
6)'Entry',一个 Code 和它所代表的字符串(string)
4.压缩算法的简单示例,不是完全实现 LZW 算法,只是从最直观的角度看 lzw 算法的思想