GIF影象格式(一)——基礎演算法(上)
阿新 • • 發佈:2019-02-08
現在我們看看每一步是怎麼做的:
第一步:初始化我們的編碼表。剛才說了,初始化編碼表只需要一個引數: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...)
第一步:初始化我們的編碼表。剛才說了,初始化編碼表只需要一個引數: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...)