一.LZW编解码大致介绍
LZW编码是在以色列人Lemple和Ziv共同提出的LZ压缩技术( 即查找冗余字符并用较短代码代替冗余字符) 基础上,经美国人Welch扩充而形成的一种先进的串表压缩方法,简称为LZW压缩方法,被广泛应用于图像压缩领域。其原理是让每个字符都与下个字符配成一个字符对,并为每个字符对设定一个数字。当相同字符对再次出现时,就用数字来替换,然后再将这个数字与下一个字符继续配对,生成的压缩文件只存储数字不存储字符对,从而大大提高了图像文件的压缩比。故采用LZW编码时,首先需要建立一个用以存储字符串及其对应数字代码的字符串表,然后把每一个首次出现的字符串放入字符串表中,并用一个与该字符串在字符串表中的位置有关的数字来代表此字符串,并将这个数字存入文件中; 如果再次出现该字符串,则用代表它的数字来代替该字符串,并将数字存入字符串表中。由此可见,字符串表是在压缩过程中动态生成的,因此当压缩结束后,可丢弃字符串表; 同样,解压过程能根据压缩数据正确地重构字符串表,因而也不需存储字符串表。这样,就不需要占用额外的空间来存储字符串表,从而减少了压缩文件的大小。
二.编码核心思想
步骤1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。
步骤2:当前字符C=字符流中的下一个字符。
步骤3:判断P+C是否在词典中
(1)如果“是”,则用C扩展P,即让P=P+C,返回到步骤2。
(2)如果“否”,则
输出与当前前缀P相对应的码字W;
将P+C添加到词典中;
令P=C,并返回到步骤2
LZW编码算法可用下述函数实现。首先初始化词典,然后顺序从待压缩文件中读入字符并按照上述算法执行编码。最后将编得的码字流输出至文件中。
0-255已经设定好了单个字符,所以新词条写入起始位置是256
P | C | P+C | 判断 | |
空 | a | a | 是 | p=a |
a | b | ab | 否 | 输出p=a,将ab加入词典,index256.p现在是b |
b | b | bb | 否 | 输出p=b,将bb加入词典,index257,p现在是b |
b | a | ba | 否 | 输出p=b,将ba加入词典,index258,p现在是a |
a | b | ab | 是 | p=ab |
ab | a | aba | 否 | 输出p=ab,将aba加入词典,index25,p现在是a</ |