當前位置:首頁 » 文件管理 » lzw解壓縮

lzw解壓縮

發布時間: 2022-05-09 23:23:40

⑴ zip 的壓縮原理與實現

文件壓縮原理

我們使用計算機所做的事情大多都是對文件進行處理。每個文件都會佔用一定的磁碟空間,我們希望一些文件,尤其是暫時不用但又比較重要不能刪除的文件(如備份文件,有點像雞肋呀),盡可能少的佔用磁碟空間。但是,許多文件的存儲格式是比較鬆散的,這樣就浪費了一些寶貴的計算機存儲資源。這時,我們可以藉助壓縮工具解決這個問題,通過對原來的文件進行壓縮處理,使之用更少的磁碟空間保存起來,當需要使用時再進行解壓縮操作,這樣就大大節省了磁碟空間。當你要拷貝許多小文件時,通過壓縮處理可以提高執行效率。如果小文件很多,操作系統要執行頻繁的文件定位操作,需要花費很多的時間。如果先把這些小文件壓縮,變成一個壓縮文件後,再拷貝時就很方便了。由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請您在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式jpg。但是更多情況下壓縮數據必須准確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當然,壓縮包已經是另一種文件格式了,如果你想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有winzip、winrar等

⑵ LZW演算法的LZW演算法簡介

字元串和編碼的對應關系是在壓縮過程中動態生成的,並且隱含在壓縮數據中,解壓的時候根據表來進行恢復,算是一種無損壓縮.
根據 Lempel-Ziv-Welch Encoding ,簡稱 LZW 的壓縮演算法,用任何一種語言來實現它.
LZW壓縮演算法 的基本概念:LZW壓縮有三個重要的對象:數據流(CharStream)、編碼流(CodeStream)和編譯表(String Table)。在編碼時,數據流是輸入對象(文本文件的據序列),編碼流就是輸出對象(經過壓縮運算的編碼數據);在解碼時,編碼流則是輸入對象,數據流是輸出對象;而編譯表是在編碼和解碼時都須要用藉助的對象。
字元(Character):最基礎的數據元素,在文本文件中就是一個位元組,在光柵數據中就是一個像素的顏色在指定的顏色列表中的索引值;
字元串(String):由幾個連續的字元組成;
前綴(Prefix):也是一個字元串,不過通常用在另一個字元的前面,而且它的長度可以為0;
根(Root):一個長度的字元串;
編碼(Code):一個數字,按照固定長度(編碼長度)從編碼流中取出,編譯表的映射值;圖案:一個字元串,按不定長度從數據流中讀出,映射到編譯表條目.
LZW壓縮演算法 的基本原理:提取原始文本文件數據中的不同字元,基於這些字元創建一個編譯表,然後用編譯表中的字元的索引來替代原始文本文件數據中的相應字元,減少原始數據大小。看起來和調色板圖象的實現原理差不多,但是應該注意到的是,我們這里的編譯表不是事先創建好的,而是根據原始文件數據動態創建的,解碼時還要從已編碼的數據中還原出原來的編譯表.

⑶ 壓縮演算法原理

哈夫曼
哈夫曼編碼是無損壓縮當中最好的方法。它使用預先二進制描述來替換每個符號,長度由特殊符號出現的頻率決定。常見的符號需要很少的位來表示,而不常見的符號需要很多為來表示。

哈夫曼演算法在改變任何符號二進制編碼引起少量密集表現方面是最佳的。然而,它並不處理符號的順序和重復或序號的序列。

2.1 原理
我不打算探究哈夫曼編碼的所有實際的細節,但基本的原理是為每個符號找到新的二進製表示,從而通常符號使用很少的位,不常見的符號使用較多的位。

簡短的說,這個問題的解決方案是為了查找每個符號的通用程度,我們建立一個未壓縮數據的柱狀圖;通過遞歸拆分這個柱狀圖為兩部分來創建一個二叉樹,每個遞歸的一半應該和另一半具有同樣的權(權是 ∑ N K =1 符號數 k , N 是分之中符號的數量,符號數 k 是符號 k出現的次數 )

這棵樹有兩個目的:

1. 編碼器使用這棵樹來找到每個符號最優的表示方法

2. 解碼器使用這棵樹唯一的標識在壓縮流中每個編碼的開始和結束,其通過在讀壓縮數據位的時候自頂向底的遍歷樹,選擇基於數據流中的每個獨立位的分支,一旦一個到達葉子節點,解碼器知道一個完整的編碼已經讀出來了。

壓縮後的數據流是 24 位(三個位元組),原來是 80 位( 10 個位元組)。當然,我應該存儲哈夫曼樹,這樣解碼器就能夠解碼出對應的壓縮流了,這就使得該例子中的真正數據流比輸入的流數據量大。這是相對較短的數據上的副作用。對於大數據量來說,上面的哈夫曼樹就不佔太多比例了。

解碼的時候,從上到下遍歷樹,為壓縮的流選擇從左 / 右分支,每次碰到一個葉子節點的時候,就可以將對應的位元組寫到解壓輸出流中,然後再從根開始遍歷。

2.2 實現
哈夫曼編碼器可以在基本壓縮庫中找到,其是非常直接的實現。

這個實現的基本缺陷是:

1. 慢位流實現

2. 相當慢的解碼(比編碼慢)

3. 最大的樹深度是 32 (編碼器在任何超過 32 位大小的時候退出)。如果我不是搞錯的話,這是不可能的,除非輸出的數據大於 2 32位元組。

另一方面,這個實現有幾個優點:

1. 哈夫曼樹以一個緊密的形式每個符號要求 12 位(對於 8 位的符號)的方式存儲,這意味著最大的頭為 384 。

2. 編碼相當容易理解

哈夫曼編碼在數據有噪音的情況(不是有規律的,例如 RLE )下非常好,這中情況下大多數基於字典方式的編碼器都有問題。

⑷ 什麼是"LZW 壓縮"

首先是lzw的概念 LZW(Lempel Ziv Welch)壓縮編碼是一種先進的數據壓縮技術,屬於無損壓縮編碼,該編碼主要用於圖像數據的壓縮。對於簡單圖像和平滑且雜訊小的信號源具有較高的壓縮比,並且有較高的壓縮和解壓縮速度。

一個較大的文件經壓縮後,產生了另一個較小容量的文件。而這個較小容量的文件,我們就叫它是這些較大容量的(可能一個或一個以上的文件)的壓縮文件。而壓縮此文件的過程稱為文件壓縮。

網路上有兩種常見的壓縮格式:一種是Zip,另一種是EXE。其中Zip的壓縮文件可以通過WinZip這套解壓縮工具進行解壓縮,而EXE則是屬於自解壓文件,只要用滑鼠雙擊這類下載後的文件圖標(若您的Windows98屬於Web風格,則只需按一下),便可以自動解壓縮。


因為EXE文件內含解壓縮程序,因此會比Zip略大一些。若想充分考慮到文件容量的大小,其實Zip是一個較佳的選擇。

壓縮技術可分為通用無損數據壓縮與有損壓縮兩大類,但不管是採用何種技術模型,其本質內容都是一樣的,即都是通過某種特殊的編碼方式將數據信息中存在的重復度、冗餘度有效地降低,從而達到數據壓縮的目的。

⑸ 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演算法壓縮用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演算法壓縮的文件解壓縮

ok

⑻ 請問LZW的文件解壓用什麼軟體啊

網路里搜裝機必備,裡面都有角解壓的軟體,通常的是WinRAR,好壓等。下載後安裝即可。

⑼ 在lzw演算法解壓縮過程中,會不會出現編碼不在字典中的情況

會。要將該串加入到串表中。

LZW演算法
LZW演算法基於轉換串表(字典)T,將輸入字元串映射成定長(通常為12位)的碼字。在12位4096種可能的代碼中,256個代表單字元,剩下3840給出現的字元串。
LZW字典中的字元串具有前綴性,即 ωK∈T=>ω∈T。
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

⑽ 求LZW壓縮,解壓演算法詳解流程

LZW壓縮演算法
LZW演算法流程圖
LZW演算法基於轉換串表(字典)T,將輸入字元串映射成定長(通常為12位)的碼字。在12位4096種可能的代碼中,256個代表單字元,剩下3840給出現的字元串。
LZW字典中的字元串具有前綴性,即 ωK∈T=>;ω

T。
LZW演算法流程:
步驟1: 開始時的詞典包含所有可能的根(Root),而當前前綴P是空的;
步驟2: 當前字元(C) :=字元流中的下一個字元;
步驟3: 判斷綴-符串P+C是否在詞典中
(1) 如果「是」:P := P+C // (用C擴展P) ;
(2) 如果「否」
① 把代表當前前綴P的碼字輸出到碼字流;
② 把綴-符串P+C添加到詞典;
③ 令P := C //(現在的P僅包含一個字元C);
步驟4: 判斷碼字流中是否還有碼字要譯
(1) 如果「是」,就返回到步驟2;
(2) 如果「否」
① 把代表當前前綴P的碼字輸出到碼字流;
② 結束。


LZW解壓演算法
具體解壓步驟如下:
(1)解碼開始時Dictionary包含所有的根。
(2)讀入在編碼數據流中的第一個碼字 cW(它表示一個Root)。
(3)輸出String.cW到字元數據流Charstream。
(4)使pW=cW 。
(5)讀入編碼數 據流 的下一個碼字cW 。
(6)目前在字典中有String.cW嗎?
YES:1)將String.cW輸出給字元數據流;
2)使P=String.pW;
3)使C=String.cW的第一個字元;
4)將字元 串P+C添 加進Dictionray。
NO :1)使P=String.pW ;
2)使C=String.pW的第一個字元;
3)將字元串P+C輸出到字元數據流並將其添加進Dictionray(現在它與cW相一致)。
(7)在編碼數據 流中還有Codeword嗎?
YES:返回(4)繼 續進行 解碼 。
NO:結束解碼 。

熱點內容
司機會所訪問 發布:2025-02-01 15:54:11 瀏覽:780
家用電腦改成伺服器並讓外網訪問 發布:2025-02-01 15:30:23 瀏覽:354
javac工資 發布:2025-02-01 15:24:28 瀏覽:22
如何刪除伺服器登錄賬號 發布:2025-02-01 15:21:05 瀏覽:498
瑞薩編程器 發布:2025-02-01 15:19:18 瀏覽:85
上海ntp伺服器搭建 發布:2025-02-01 15:03:38 瀏覽:991
c游戲編程基礎 發布:2025-02-01 15:00:17 瀏覽:993
routejs怎麼動態配置 發布:2025-02-01 14:59:07 瀏覽:502
家用電腦安裝伺服器內存 發布:2025-02-01 14:38:50 瀏覽:257
增量調制編解碼實驗報告 發布:2025-02-01 14:30:30 瀏覽:787