0%

LZW算法简解

LZW(Lempel-Ziv & Welch)编码又称字串表编码,是Welch将Lemple和Ziv所提出来的无损压缩技术改进后的压缩方法。GIF图像文件采用的是一种改良的LZW压缩算法,通常称为GIF-LZW压缩算法。

****

LZW编码基本原理:

把每一个第一次出现的字符串用一个数值来编码,解码时再将数值编码还原成原来字符:如果用0X100代替字符串中的“ABCDDEEF”,那么每当这样的字符串出现时都会用0X100来表示,以达到压缩的目的。注意的是这个字符串和数值之间的关系是动态生成的。

LZW算法基本步骤:

主要包括两个部分:串表与码字值

1、将待编码字符串中的所有单个字符存入字符串表(串表)中,并给每个符号赋一个码字值。

2、读入第一个输入字符,将其赋值给P(P为前缀串)。

3、读入下一个字符,将其赋值给S(前缀串P的扩展字符)。

如果PS构成的字符串不在串表中,则将字符串PS的前缀串P对应的码字值输出;将字符串PS存入串表;给PS分配一个码字值;将PS的扩展字符S赋值给P,用P与下一个输入字符形成新的字符串。

OR

如果PS已经在串表中,则将PS赋值给P,用P与下一个输入字符形成新的字符串。

举个例子:

下面对字符串BABAABAAA进行编码。

根据以上的算法,令P=B,然后读入字符串序列中的下一个字符A,令S=A。

由于串表中并没有PS构成的字符串BA,于是将BA加入串表。

由于0~255已在串表中赋给了单个的字符,这里只能给BA赋予256的码值。

同时将BA的前缀B的码值(B的码值为66)输出。

将BA的扩展字符赋值给P,即令P=A,接着进行下一个循环。

输出下一个(第三个)字符B,令S=B,由PS构成新的字符串AB。

由于串表中没有字符串AB,于是将AB赋码值257,并将AB存入串表中。

同时输出字符串AB的前缀A对应的码值65,将AB的扩展字符B赋值给P,即P=B。

接着进行下一次循环,输入下一个(第四个)字符A,令S=A。

此时,由于PS构成的字符串BA已在串表中,所以将BA作为下一个新字符串的前缀,即P=BA。

接着重新开始下一次循环,输入下一个字符(第五个)A,令S=A。

形成新的字符串PS,即BAA,由于串表中没有BAA,于是将BAA的前缀BA对应的码值256输出,给字符串BAA赋予码值258,并将BAA存入串表中。

将BAA的扩展字符A赋值给P,令P=A,接着输入下一个字符,如此下去,直到字符串结束为止。

经过词算法计算后,字符串BABAABAAA将被编码成6个代码<66><65><256><257><65><260>。

现在,基本的压缩编码便完成了。

参考:

http://www.limou.net/?p=730

http://apps.hi.baidu.com/share/detail/20146343

坚持原创技术分享,您的支持将鼓励我继续创作!

Welcome to my other publishing channels