当前位置:首页 » 文件管理 » lzw算法压缩

lzw算法压缩

发布时间: 2024-06-14 06:04:16

‘壹’ LZW算法的LZW算法简介

字符串和编码的对应关系是在压缩过程中动态生成的,并且隐含在压缩数据中,解压的时候根据表来进行恢复,算是一种无损压缩.
根据 Lempel-Ziv-Welch Encoding ,简称 LZW 的压缩算法,用任何一种语言来实现它.
LZW压缩算法 的基本概念:LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String Table)。在编码时,数据流是输入对象(文本文件的据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。
字符(Character):最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是一个像素的颜色在指定的颜色列表中的索引值;
字符串(String):由几个连续的字符组成;
前缀(Prefix):也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;
根(Root):一个长度的字符串;
编码(Code):一个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目.
LZW压缩算法 的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.

‘贰’ 用lzw算法压缩用TC3.0的getimage函数提取的图像数据进行压缩和解压

在字典表之外单独维护一个散列表,该表中的每个元素都可以保存一个字典表的索引值。例如,对于新字符串“al”,我们可以按照LZW传统的做法,在字典表中依顺序找出第一个空的字典项,然后,通过散列函数,将该字典项的索引值(如257)存在散列表中的相应位置。实际输出时,输出字典表的索引值(而不是散列表的索引值)。这样,解压程序看到的数据内容和没有使用散列算法时的数据内容完全一致,只要按照LZW的传统做法依次解压就行了。

其实,关于在LZW中使用散列的具体做法有很多种,开发者基于时间/空间上的不同考虑,会选择不同的解决方案。

LZW算法中,首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,这个数字与此字符串在串表中的位置有关,并将这个数字存入压缩文件中,如果这个字符串再次出现时,即可用表示它的数字来代替,并将这个数字存入文件中。压缩完成后将串表丢弃。如"print" 字符串,如果在压缩时用266表示,只要再次出现,均用266表示,并将"print"字符串存入串表中,在图象解码时遇到数字266,即可从串表中查出266所代表的字符串"print",在解压缩时,串表可以根据压缩数据重新生成。

压缩算法的简单示例,不是完全实现LZW算法,只是从最直观的角度看lzw算法的思想
对原始数据ABCCAABCDDAACCDB进行LZW压缩
原始数据中,只包括4个字符(Character),A,B,C,D,四个字符可以用一个2bit的数表示,0-A,1-B,2-C,3-D,从最直观的角度看,原始字符串存在重复字符:ABCCAABCDDAACCDB,用4代表AB,4代表CC,上面的字符串可以替代表示为:45A4CDDAA5DB,这样是不是就比原数据短了一些呢!

-------------------------------------------------------
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算法的思想
对原始数据ABCCAABCDDAACCDB进行LZW压缩
原始数据中,只包括4个字符(Character),A,B,C,D,四个字符可以用一个2bit的数表示,0-A,1-B,2-C,3-D,从最直观的角度看,原始字符串存在重复字符:ABCCAABCDDAACCDB,用4代表AB,4代表CC,上面的字符串可以替代表示为:45A4CDDAA5DB,这样是不是就比原数据短了一些呢!
5.LZW算法的适用范围
为了区别代表串的值(Code)和原来的单个的数据值(String),需要使它们的数值域不重合,上面用0-3来代表A-D,那么AB就必须用大于3的数值来代替,再举另外一个例子,原来的数值范围可以用8bit来表示,那么就认为原始的数的范围是0~255,压缩程序生成的标号的范围就不能为0~255(如果是0-255,就重复了)。只能从256开始,但是这样一来就超过了8位的表示范围了,所以必须要扩展数据的位数,至少扩展一位,但是这样不是增加了1个字符占用的空间了么?但是却可以用一个字符代表几个字符,比如原来255是8bit,但是现在用256来表示254,255两个数,还是划得来的。从这个原理可以看出LZW算法的适用范围是原始数据串最好是有大量的子串多次重复出现,重复的越多,压缩效果越好。反之则越差,可能真的不减反增了。
6.LZW算法中特殊标记
随着新的串(string)不断被发现,标号也会不断地增长,如果原数据过大,生成的标号集(string table)会越来越大,这时候操作这个集合就会产生效率问题。如何避免这个问题呢?Gif在采用lzw算法的做法是当标号集足够大的时候,就不能增大了,干脆从头开始再来,在这个位置要插入一个标号,就是清除标志CLEAR,表示从这里我重新开始构造字典,以前的所有标记作废,开始使用新的标记。
这时候又有一个问题出现,足够大是多大?这个标号集的大小为比较合适呢?理论上是标号集大小越大,则压缩比率就越高,但开销也越高。 一般根据处理速度和内存空间连个因素来选定。GIF规范规定的是12位,超过12位的表达范围就推倒重来,并且GIF为了提高压缩率,采用的是变长的字长。比如说原始数据是8位,那么一开始,先加上一位再说,开始的字长就成了9位,然后开始加标号,当标号加到512时,也就是超过9为所能表达的最大数据时,也就意味着后面的标号要用10位字长才能表示了,那么从这里开始,后面的字长就是10位了。依此类推,到了2^12也就是4096时,在这里插一个清除标志,从后面开始,从9位再来。
GIF规定的清除标志CLEAR的数值是原始数据字长表示的最大值加1,如果原始数据字长是8,那么清除标志就是256,如果原始数据字长为4那么就是16。另外GIF还规定了一个结束标志END,它的值是清除标志CLEAR再加1。由于GIF规定的位数有1位(单色图),4位(16色)和8位(256色),而1位的情况下如果只扩展1位,只能表示4种状态,那么加上一个清除标志和结束标志就用完了,所以1位的情况下就必须扩充到3位。其它两种情况初始的字长就为5位和9位。此处参照了http://blog.csdn.net/whycadi/
7.用lzw算法压缩原始数据的示例分析
输入流,也就是原始的数据为:255,24,54,255,24,255,255,24,5,123,45,255,24,5,24,54..................
这个正好可以看到是gif文件中像素数组的一部分,如何对它进行压缩
因为原始数据可以用8bit来表示,故清除标志Clear=255+1 =256,结束标志为End=256+1=257,目前标号集为
0 1 2 3 .................................................................................255 CLEAR END
第一步,读取第一个字符为255,在标记表里面查找,255已经存在,我们已经认识255了,不做处理
第二步,取第二个字符,此时前缀为A,形成当前的Entry为(255,24),在标记集合不存在,我们并不认识255,24好,这次你小子来了,我就记住你,把它在标记集合中标记为258,然后输出前缀A,保留后缀24,并作为下一次的前缀(后缀变前缀)
第三步,取第三个字符为54,当前Entry(24,54),不认识,记录(24,54)为标号259,并输出24,后缀变前缀
第四部:取第四个字符255,Entry=(54,255),不认识,记录(54,255)为标号260,输出54,后缀变前缀
第五步 取第5个字符24,entry=(255,24),啊,认识你,这不是老258么,于是把字符串规约为258,并作为前缀
第六步 取第六个字符255,entry=(258,255),不认识,记录(258,255)为261,输出258,后缀变前缀
.......
一直处理到最后一个字符

‘叁’ LZW是什么意思

LZW压缩编码
LZW(Lempel Ziv Welch)压缩编码是一种先进的数据压缩技术,属于无损压缩编码,该编码主要用于图像数据的压缩。对于简单图像和平滑且噪声小的信号源具有较高的压缩比,并且有较高的压缩和解压缩速度。
1977年,两位以色列教授Lempel和Ziv提出了查找冗余字符和用较短的符号标记替代冗余字符的概念。1985年,由Welch加以充实而形成LZW,简称“LZW”技术。

1.LZW压缩基本原理
LZW压缩技术把数据流中复杂的数据用简单的代码来表示,并把代码和数据的对应关系建立一个转换表,又叫“字符串表”。
转换表是在压缩或解压缩过程中动态生成的表,该表只在进行压缩或解压缩过程中需要,一旦压缩和解压缩结束,该表将不再起任何作用。

2.LZW算法
LZW算法基于转换串表(字典)T,将输入字符串映射成定长(通常为12位)的码字。在12位4096种可能的代码中,256个代表单字符,剩下3840给出现的字符串。
LZW字典中的字符串具有前缀性,即 。

LZW算法流程:
1)初始化:将所有的单字符串放入串表
2)读第一个输入字符给前缀串ω
3)Step: 读下一个输入字符K;

if 没有这样的K(输入已穷尽):

码字(ω) 输出;结束。

If ωK 已存在于串表中:

ωK:=ω;repeat Step;

else ωK不在于串表中:

码字(ω) 输出;

ωK加进串表;

K:=ω;repeat Step.

例子:ababcbababaaaaaaa

LZW编码:a,b,c,ab,ba,abc,cb,bab,baba,aa,aaa,aaaa

3.LZW压缩的特点

LZW码能有效利用字符出现频率冗余度进行压缩,且字典是自适应生成的,但通常不能有效地利用位置冗余度。

具体特点如下:
l)LZW压缩技术对于可预测性不大的数据具有较好的处理效果,常用于GIF格式的图像压缩,其平均压缩比在2)1以上,最高压缩比可达到3:1。
2)对于数据流中连续重复出现的字节和字串,LZW压缩技术具有很高的压缩比。
3)除了用于图像数据处理以外,LZW压缩技术还被用于文本程序等数据压缩领域。
4)LZW压缩技术有很多变体,例如常见的ARC、RKARC、PKZIP高效压缩程序。
5)对于任意宽度和像素位长度的图像,都具有稳定的压缩过程。压缩和解压缩速度较快。
6)对机器硬件条件要求不高,在 Intel 80386的计算机上即可进行压缩和解压缩。

‘肆’ LZW铡嬬缉绠楁硶锛

鍦ㄨ$畻链鸿呜(CV)棰嗗烟锛岄殢镌瀵瑰浘镀忚瘑鍒绮惧害瑕佹眰镄勬彁鍗囷纴浼犵粺镄勫抚闂村帇缂╃畻娉曞侣264宸叉樉寰椾笉澶熼珮鏁堛备负姝わ纴MJPEG杩欑被镞犲抚闂村帇缂╃殑瑙e喅鏂规埚簲杩愯岀敓锛岃繘涓姝ユ帹锷ㄤ简镞犳崯铡嬬缉绠楁硶鍦–V鑺鐗囦腑镄勫簲鐢ㄣ傚叾涓锛孡ZW绠楁硶鍑鍊熷叾镫鐗圭殑浼桦娍锛屾垚涓轰简鎺㈣ㄧ殑铹︾偣銆


LZW绠楁硶镄勬牳蹇冨湪浜庡缓绔嬩竴涓镊阃傚簲镄勫瓧绗︿覆缂栫爜琛锛岄氲繃灏嗛暱瀛楃︿覆镟挎崲涓鸿缉鐭镄勭紪镰侊纴瀹炵幇鏁版嵁镄勯珮鏁埚帇缂┿杩欎竴绠楁硶婧愪簬涓や綅绉戝﹀禯iv鍜孡empel鍦1977鍜1978骞寸殑寮鍒涙у伐浣滐纴钥孴erry Welch鍦1984骞寸殑鏀硅繘浣垮叾骞夸负浜虹煡锛屽洜姝ゅ缑钖峀ZW銆傚湪瀹为檯搴旂敤涓锛孡ZW灏ゅ叾鍦℅IF锲惧儚铡嬬缉涓澶ф斁寮傚僵銆


缂栫爜杩囩▼寮濮嬩簬鍒濆嫔寲涓涓涓闂村瘎瀛桦櫒R锛屽苟灏嗘疮涓瀛楃K阃愪竴澶勭悊銆傚傛灉褰揿墠镄凴K瀛楃︿覆宸茬粡鍦ㄥ瓧鍏竏ict涓锛屽氨镟存柊瀵勫瓨鍣≧锛涘惁鍒欙纴杈揿嚭R镄勭紪镰侊纴灏哛K娣诲姞鍒板瓧鍏镐腑锛屽啀缁х画澶勭悊涓嬩竴涓瀛楃︺备緥濡傦纴杈揿叆瀛椾覆"BABAABAAA"锛屽埯濮嫔瓧鍏镐负{'A':1, 'B':2, 'C':3}锛屾渶缁堣緭鍑轰负[2,1,4,5,1,8]锛屽苟镓╁𪾢浜嗗瓧鍏搞


瑙g爜镞讹纴浠庤緭鍏ユ暟缁勪腑璇诲彇绗涓涓瀛楃K锛岃緭鍑哄瓧鍏镐腑镄勫瑰簲鍊硷纴铹跺悗镟存柊瀵勫瓨鍣≧銆傚逛簬钖庣画瀛楃︼纴濡傛灉鍦ㄥ瓧鍏镐腑镓惧埌锛屽氨杈揿嚭瀵瑰簲鍊硷绂钖﹀垯锛屽皢瀛楀吀涓璕镄勫煎拰褰揿墠瀛楃︾殑鍊肩浉锷犱綔涓烘柊阌鍊煎姞鍏ュ瓧鍏革纴鍐嶈緭鍑哄瓧绗︺傚傚皢[2,1,4,5,1,8]瑙g爜锛岃緭鍑轰负铡熷嫔瓧绗︿覆銆


LZW绠楁硶镄勪紭锷垮湪浜庤兘链夋晥鍒╃敤瀛楃﹂戠巼镄勫啑浣欙纴鐢熸垚镊阃傚簲镄勫瓧鍏革纴瀵瑰彲棰勬祴镐т笉寮虹殑鏁版嵁琛ㄧ幇鍑鸿壊銆傚湪鐩戞带锲惧儚杩欑被鍙桦寲杈冩参镄勫満鏅锛屽畠鑳芥彁渚涢珮铡嬬缉姣斻傜劧钥岋纴LZW骞朵笉镎呴暱鍒╃敤浣岖疆鍐椾綑锛屽逛簬浣岖疆鐩稿叧镐ц缉寮虹殑杩炵画閲嶅嶆暟鎹锛屽帇缂╂晥鏋滃彲鑳戒笉濡傚叾浠栫畻娉曘傛瘆濡傦纴zip铡嬬缉阃氱敤鏂囦欢镞讹纴阃夋嫨lz77绠楁硶锛堟粦锷ㄥ瓧鍏告垨婊戝姩绐楀彛妯″瀷锛夛纴锲犱负瀹冭兘镟村ソ鍦板帇缂╁ぇ澶氭暟鏂囦欢銆


灏界LZW鍦ㄥ勭悊镆愪簺鐗瑰畾绫诲瀷镄勫浘镀忔椂琛ㄧ幇鍑鸿壊锛屽傝儗鏅鍗曚竴銆佸浘褰㈢亩鍗旷殑GIF锲剧墖锛屼絾zip绛夊帇缂╁伐鍏锋洿鍊惧悜浜庨噰鐢╨z77绛夋洿阃傚悎涓鑸鏂囦欢镄勫帇缂╃畻娉曘傚疄楠屼唬镰佹紨绀轰简LZW镄勭亩鍗曞疄鐜帮纴灞旷ず浜嗗叾鍦ㄤ笉钖岃緭鍏ュ瓧绗︿覆涓婄殑铡嬬缉鍜岃В铡嬬缉杩囩▼銆


镐荤殑𨱒ヨ达纴LZW绠楁硶浠ュ叾镫鐗圭殑铡嬬缉链哄埗鍦ㄧ壒瀹氶嗗烟涓灞旷幇浠峰硷纴浣嗗逛簬镟村箍娉涚殑鏂囦欢绫诲瀷鍜屾ц兘瑕佹眰锛屽叾浠栫畻娉曞彲鑳芥洿涓洪傜敤銆傞氲繃鐞呜В杩欎簺绠楁硶镄勫师鐞嗗拰阃傜敤鍦烘櫙锛屾垜浠鍙浠ユ洿濂藉湴阃夋嫨鍜屽簲鐢ㄥ畠浠浠ユ弧瓒矫V棰嗗烟镄勪笉钖岄渶姹伞

‘伍’ PS 保存tif格式时的LZW压缩有什么用对印刷有影响吗

今天介绍一下使用ps存储文件时常用的几个文件格式。

常规的文件格式

如图 我们可以看到存储时有很多格式可以选择,通常我们选择的格式有psd、psb、bmp、jpg、pdf、png、tif几种,下面大致说一下印前会用到的几种格式。

photoshop格式,文件名后缀psd,通常简称psd文件,可以保留文件内所有的操作内容(图层、蒙版、颜色配置等等),但是文件较大同时存储文件上限2G,不推荐使用。

psd的一种延伸,总体上与psd没什么区别,但是存储文件上限提高了,大文件存起来也没什么压力(但是实际上印前输出用不到)。

格式需要选择基线

用途比较广的一种图片格式,在网页、制作等领域通用。但是其文件存储大小也是有限制并且会丢失颜色,所以印前制作时如果要求不高,可以使用(注意,jpg文件兼容路径,所以文件里如果有路径一定要删掉,不然输出文件就会连路径一起打印出来)。存储时格式需要选择基线,否则一些打印软件识别不了。品质关系着你存储文件的质量(精度)和大小。

用途比较广的一种格式,合同、印前输出、邮件附件等常用,可以完美保存文件内容,同时作为一种矢量文件格式,文件里面未合层的矢量元素也能得以保留(请注意,是未合层的矢量元素),另外如果做专色通道的话,最好是存pdf同时合并图层。

常用的透明底文件格式,网页ppt等的好朋友。

tif文件是我着重推荐的一种文件格式,他存储文件大小的上限很高,同时可以保护图层蒙版颜色配置等所有的文件信息,而且兼容所有的打印软件(强烈推荐),存tif文件时,选择lzw压缩可以无损压缩

‘陆’ 什么是"LZW 压缩"

首先是lzw的概念 LZW(Lempel Ziv Welch)压缩编码是一种先进的数据压缩技术,属于无损压缩编码,该编码主要用于图像数据的压缩。对于简单图像和平滑且噪声小的信号源具有较高的压缩比,并且有较高的压缩和解压缩速度。

一个较大的文件经压缩后,产生了另一个较小容量的文件。而这个较小容量的文件,我们就叫它是这些较大容量的(可能一个或一个以上的文件)的压缩文件。而压缩此文件的过程称为文件压缩。

网络上有两种常见的压缩格式:一种是Zip,另一种是EXE。其中Zip的压缩文件可以通过WinZip这套解压缩工具进行解压缩,而EXE则是属于自解压文件,只要用鼠标双击这类下载后的文件图标(若您的Windows98属于Web风格,则只需按一下),便可以自动解压缩。


因为EXE文件内含解压缩程序,因此会比Zip略大一些。若想充分考虑到文件容量的大小,其实Zip是一个较佳的选择。

压缩技术可分为通用无损数据压缩与有损压缩两大类,但不管是采用何种技术模型,其本质内容都是一样的,即都是通过某种特殊的编码方式将数据信息中存在的重复度、冗余度有效地降低,从而达到数据压缩的目的。

‘柒’ “LZW压缩格式”急需各位高手讲解下!

LZW压缩格式

LZW(Lempel-Ziv Welch)表示一种算法,它能把大文件转变成更适合于网页使用的较小文件。实现方法是将一系列符号压缩成单个符号乘以该符号的出现次数。LZW压缩格式叫做“无陨”数据压缩格式,即尽管数据得到压缩,但解压后的图像看上去同原文件完全一样。

热点内容
安卓手机如何使用手写功能 发布:2024-10-22 23:19:16 浏览:351
手机壁纸上传 发布:2024-10-22 23:13:51 浏览:772
oracle数据库迁移方案 发布:2024-10-22 23:10:53 浏览:384
七牛云存储java上传 发布:2024-10-22 23:10:49 浏览:236
kvm编译原理 发布:2024-10-22 22:57:41 浏览:441
qq密码情侣改成什么最好 发布:2024-10-22 22:55:48 浏览:809
linux安装cuda 发布:2024-10-22 22:32:07 浏览:487
编译和链接的键 发布:2024-10-22 22:21:01 浏览:115
java数组的实现 发布:2024-10-22 22:18:15 浏览:331
python定义字符串数组 发布:2024-10-22 22:14:26 浏览:605