1. 程式人生 > >GIF影象格式(一)——基礎演算法(上)

GIF影象格式(一)——基礎演算法(上)

現在我們看看每一步是怎麼做的:

第一步:初始化我們的編碼表。剛才說了,初始化編碼表只需要一個引數:root_number,也就是根項的數目。其實他就是我們要編碼的Char Stream中的字符集的數目。初始化也很簡單:根據一個事先的約定對所有的Char進行排序,然後從零開始對其編上一個index,形成一個item,再把這些items從小到大排列好,就形成了初始的編碼表。

第二步:初始化一些區域性變數:主要是current_prefix和current_string,把他們都設為空字串。

第三步:開始迴圈編碼,方法如下:
從Char Stream中讀出一個Char c,然後把它接到current_prefix的後面形成current_string。
在string_table中進行查詢,看有沒有這個current_string。
有:說明這個current_string是“老的”,於是什麼都不做,僅僅把current_string賦給current_prefix;
無:說明這個current_string是“新的”,因此第一步把它變成“老的”,也就是把它插入到string_table的末端;緊接著輸出current_prefix在string_table中的index到Code Stream;最後重新開始找重複的字串,也就是把c賦給current_prefix。

這樣迴圈結束,最後肯定還餘下一個prefix,輸出它的index即可。

舉個例子吧。

假設我們的Code Stream是BBBCBBA,字符集是{A,B,C},我們約定排列方式是ASCII升序。
初始化的string_table如下: 
-----------------------
index            string
00                'A'
01                'B'
02                'C'
-----------------------
這三項就是所謂的Root Items。
然後開始編碼:簡單期間,我只是列出各個量的值,並作簡單說明。
Step        Prefix    Char c        CurrentString            Exist?       Operation            Code Stream(OUT)
01            []            B            []B=B                      yes              no                             X
02            [B]           B            [B]B=BB                  no            insert BB                index(B) = 01
03            [B]           B            [B]B=BB                  yes               no                            X
04            [BB]         C            [BB]C=BBC                no            insert BBC            index(BB)=03
05            [C]           B            [C]B=CB                   no            insert CB             index(C)=02
06            [B]           B            [B]B=BB                  yes               no                            X
07            [BB]         A            [BB]A=BBA                no            insert BBA            index(BB)=03
08            [A]          no
Output [A]'s index: index(A)=00
這樣,編碼結束了,Code Stream為:01 03 02 03 00
最終的編碼表如下:
-------------------------
index            string
00                'A'
01                'B'
02                'C'
03                'BB'
04                'BBC'
05                'CB'
06                'BBA'
-------------------------
由此可見,編碼壓縮率的大小,取決於其中重複字串的多少。
編碼就講到這裡,下面是解碼。

(To be continue...)