當前位置:成語大全網 - 書法字典 - 找到壹個使用lzw(字典)算法壓縮bmp的c++代碼

找到壹個使用lzw(字典)算法壓縮bmp的c++代碼

參見gif壓縮算法的源代碼。

1的全稱是什麽?LZW嗎?

倫佩爾-齊夫-韋爾奇(LZW)。

2.LZW的引入和壓縮原理是什麽?

LZW壓縮算法是壹種新穎的壓縮方法,由萊姆普爾-齊夫-韋爾奇創立並以他們的名字命名。它采用了高級的字符串表壓縮,將每個第壹個字符串放在壹個字符串表中,並使用壹個數字來表示該字符串。壓縮後的文件只存儲數字,不存儲字符串,大大提高了圖像文件的壓縮效率。神奇的是,這個字符串表可以在壓縮或解壓縮過程中正確建立,並且在壓縮或解壓縮後被丟棄。

在LZW算法中,首先建立壹個字符串表,將每個首次出現的字符串放入字符串表中並用壹個數字表示,該數字與字符串在字符串表中的位置有關,並將該數字存儲在壹個壓縮文件中。如果該字符串再次出現,它可以被代表它的數字替換,並且該數字存儲在文件中。壓縮後丟棄字符串表。例如,如果“print”字符串在壓縮時由266表示,則每當它再次出現時都將由266表示,並且“print”字符串將存儲在字符串表中。當在圖像解碼過程中遇到數字266時,可以從字符串表中找到由266表示的字符串“print”,並且可以在解壓縮時根據壓縮數據重新生成字符串表。

3.在詳細介紹算法之前,先列出壹些與算法相關的概念和詞匯。

1)“字符”:壹個字符,壹個基本的數據元素,在普通文本文件中占據1個單獨的字節,但在圖像中,它是壹個表示給定像素顏色的索引值。

2)“CharStream”:數據文件中的字符流。

3)“前綴”:前綴。就像這個詞的意思壹樣,它代表了壹個字符之前最直接的字符。前綴字符的長度可以是0,前綴和字符可以組成壹個字符串。

4)“後綴”:後綴,它是壹個字符。壹個字符串可以由(A,B)組成。a是前綴,b是後綴。當A的長度為0時,它表示根。

5)‘Code:代碼,用於表示字符串的位置編碼。

6)“條目”,壹個代碼及其代表的字符串。

4.壓縮算法的簡單示例並不是要完全實現lzw算法,而是從最直觀的角度來看待LZW算法的思想。

原始數據的LZW壓縮。

在原始數據中,只有四個字符(A,B,C,D),可以用壹個2-2位的數字表示,0-A,1-B,2-C,3-D .從最直觀的角度來看,原始字符串有重復的字符:ABCCAABCDDAACCDB,4表示AB,5。

5.5 .適用範圍。LZW算法

為了區分代表字符串的值(代碼)和原始的單個數據值(字符串),有必要使它們的數值字段不重合,0-3用於代表A-D,因此AB必須由大於3的數值替換。再如,原始數值範圍可以用8位表示,因此認為原始數值範圍為0 ~ 255,壓縮程序生成的標簽範圍不能為0 ~。我們只能從256開始,但這將超出8位表示的範圍,因此我們必須將數據位數至少擴展壹位,但這不會增加1個字符所占用的空間嗎?然而,壹個字符可以代表幾個字符。例如,255過去是8位,但現在值得使用256來表示兩個數字,即254和255。從這個原理可以看出,LZW算法的適用範圍是原始數據串應該有大量重復多次的子串,重復次數越多,壓縮效果越好。相反,情況越糟糕,實際上可能越是增加而不是減少。

6.6號特殊標誌。LZW算法

隨著新字符串的發現,標簽將繼續增長。如果原始數據太大,生成的標簽表將變得越來越大。此時,操作此集合將導致效率問題。如何避免這個問題?Gif使用lzw算法的方式是,當標簽集足夠大時,它顯然不會增加,因此只需從頭開始。在這個位置插入了壹個標簽,這意味著我重新開始構造字典,之前的所有標簽都無效並開始使用新的標簽。

這時,另壹個問題出現了。它有多大?這個標簽集的合適大小是多少?理論上,標簽集越大,壓縮比越高,但開銷也越高。壹般根據處理速度和內存空間來選擇。GIF規範規定12位,如果表達式範圍超過12位,將重新創建。為了提高壓縮率,GIF使用可變字長。例如,原始數據是8位,所以在開始時,先添加壹位,初始字長變為9位,然後開始添加標簽。當標簽被添加到512時,即當超過9是可以表示的最大數據時,這意味著後面的標簽只能用10位表示,因此從這裏開始,後面的字長為10。以此類推,當它達到2 12,即4096時,在此處插入壹個清晰的符號,從後面開始,從9位數字開始。

GIF指定的清除標誌的值是原始數據字長的最大值加上1。如果原始數據字長為8,則清除標誌為256,如果原始數據字長為4,則為16。此外,GIF還指定了壹個結束標誌END,其值為清除標誌加1。因為GIF中指定的位數是1(單色圖像)、4(16彩色)和8(256彩色),如果在1位的情況下僅擴展1位來表示4種狀態,那麽添加清除標誌和結束標誌將被用完,因此1位將被用完。在其他兩種情況下,初始字長分別為5位和9位。/whycadi/

7.lzw算法壓縮原始數據的實例分析

輸入流,即原始數據為:255,24,54,255,24,255,24,5,123,45,255,24,5,24,54。..................

這只是gif文件中像素數組的壹部分。怎麽壓縮?

因為原始數據可以用8位表示,所以清除標誌是Clear=255+1 =256,結束標誌是End=256+1=257,當前標簽集是

0 1 2 3 .................................................................................255清除結束

第壹步是將第壹個字符讀為255,並在標記表中查找它。255已經存在,我們已經知道255,所以我們不處理它。

第二步,取第二個字符,此時前綴為a,當前條目為(255,24),該條目在標簽集中不存在。我們不知道255,24。這壹次,當妳的男孩來時,我會記住妳,在標簽集中將其標記為258,然後輸出前綴A,保留後綴24,並將其作為下壹個前綴(後綴更改前綴)。

第三步,取第三個字符為54,當前條目(24,54),我不知道,記錄(24,54)為數字259,輸出24,後綴改為前綴。

第四部分:取第四個字符255,Entry =(54,255),我不知道,記錄(54,255)為參考數260,輸出54,並將後綴改為前綴。

第五步取第五個字符24,entry =(255,24),啊,我認識妳,這不是舊的258嗎,所以字符串指定為258並用作前綴。

第六步:取第六個字符255,entry =(258,255),我不知道,記錄(258,255)為261,輸出258,將後綴改為前綴。

.......

處理直到最後壹個字符,

用表格記錄這個過程。

清除=256,結束=257

第壹步前綴後綴輸入已知(Y/N)輸出標簽。

1 255 (,255)

N 255 258

24 54(24,54)N 24 259

N 54 260

255 24(255,24)Y

6 258 255(258 255)N 258 261

N 255 262

.....

上面的壹些例子不能完全反映出來。另壹個例子是

原始輸入數據為:ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA。.....

使用LZW算法對其進行壓縮,壓縮過程表示為表:

註意,原始數據只包含四個字符,A、B、C、D、B、C和D。

它可以用兩位來表示。根據lzw算法,首先將壹位擴展為3,Clear的二次方= 2+1 = 4;end = 4+1 = 5;

初始標簽集應該是

0 1 2 3 4 5

清晰的結尾

壓縮過程是:

第壹步前綴後綴輸入已知(Y/N)輸出標簽。

1 A(,A)

2 A B(A,B)N a6

3 B A(B,A)N B 7

4a B(A,B)Y

56 A(6,A)N 6 8

6a B(A,B)Y

7 6a(6,A)Y

8 8 B(8,B)N 8 9

9 B B(B,B)N B 10

10 B B(B,B)Y

11 10 A(10,A)N 10 11

12 A B(A,B)Y

.....

當轉到步驟12時,標簽集應為

0 1 2 3 4 5 6 7 8 9 10 11

6A 8B BB 10A

8.8的偽代碼實現。LZW算法

1STRING =獲取輸入字符

2當仍有輸入字符時

3字符=獲取輸入字符

4如果字符串+字符在字符串表中,則

5字符串=字符串+字符

6其他

7輸出字符串的代碼

8將字符串+字符添加到字符串表中

9字符串=字符

10 IF結束

11 WHILE結束

12輸出字符串的代碼

13