Posted on 2006-10-29 09:24
neter 閱讀(493)
評論(0) 編輯 收藏 引用 所屬分類:
數字圖像
Gif動畫文件在網絡傳播中應用較為廣泛。雖然目前有關gif動畫文件的處理工具也可件一二,本人認為對于gif文件的進一步利用仍有許多值得開發(fā)子處。為了方便有此意向的讀者有明確的開發(fā)依據,本人特將gif89a的英文說明文檔中與gif開發(fā)有用的部分作了解釋性翻譯,希望能對有關gif的開發(fā)起到一定的幫助作用。下面就是具體的譯解。
一、編碼器
編碼器是用于生成gif文件的程序。通過光柵數據和其他信息,編碼器生成用于再現原始圖形所必須的控制塊和數據塊。它負責完成如下工作:
-將所有對再生原始圖片所必須的信息包含進來。
-確保數據流標記著包含所有數據塊定義的最早的版本號;這是為了確保可以有盡可能多的解碼器能夠處理該數據流。
-使得對圖片的編碼方法對解碼器最為優(yōu)化,盡可能避免信息的冗余。
-為了便于擴展,應該避免對圖片的分組,因為在解碼時這種分組可能需要對硬件參數進行重新設置。
-將定義為保留的字段的每一位都置為零。注意,邏輯視頻、描述符合圖像描述符中的某些字段在87a版本中是保留的,但在89a版本中卻是有用的。
二、解碼器
解碼器是用于處理gif數據流的程序。它順序地處理數據流,分析各種數據塊和子塊,使用控制信息來設置硬件及處理參數,并且解釋數據來顯示圖像。
解碼器負責完成如下工作:
·依次處理數據流中的每個圖像,按照控制信息中的設定處理圖像間的延時。
·按照在數據流中設置的控制信息,盡可能接近地設置硬件參數。
三、關于色表
gif格式利用色表來顯示基于光柵的圖像。色表分為全局色表和局部色表。全局色表對于那些沒有設置局部色表的圖像起作用。全局色表的作用域是整個數據流。局部色表對于緊接在其后的單張圖像起作用。這兩種色表都是可選的。正因為這樣,在某個gif數據流中就有可能出現很多根本不具有任何色表的圖像。因為會有如上情況發(fā)生,所以解碼器通常會保留最后一個全局色表直到得到一個新的全局色表。如果一個數據流中既沒有全局色表也沒有局部色表,解碼器就會用從上一個數據流中保留下來的全局色表來執(zhí)行。可以在一組數據流中僅設置一個全局色表來適應一系列圖片。如果確實沒有色表,解碼器會使用系統(tǒng)色表或者它自己的色表。應該說明的是,這樣的色表用黑和白作為兩個開始項,所以單色圖像可以充分顯示。
Gif格式規(guī)定一個數據流只能包含頭部、邏輯視屏描述符、全局色表和gif尾記錄。
四、塊、擴充和域
gif數據流中的數據塊可以分為三組:控制塊、成象塊和特殊用途塊。控制塊,如:頭部、邏輯視屏描述塊、圖像控制擴充和尾記錄,包含用于控制處理數據流或設置硬件參數的信息。成像塊,如:圖像描述符和純文本擴充,包含用于在顯示設備上成像的信息和數據。特殊用途塊,如:注釋擴充和應用擴充,包含那些既不用于處理數據流也不用于在顯示設備上成象的信息。除了邏輯視屏描述塊和全局色表之外,特殊用途塊的作用域是整個數據流,而其他控制塊的作用域是有限的,僅限于對他們后面的成象塊起作用。特殊用途塊不對任何控制塊構成限制,它對于解碼過程來說是透明的。成象塊及擴充用于控制塊及擴充的作用域限定。塊的標記分為三段:除尾記錄0x3b之外,0x00~0x7f用于成象塊;0x80~0xf9用于控制塊;0xfa~0xff用于特殊用途塊。解碼器通過識別塊標記來處理塊的作用域。
五、塊尺寸
一個塊中的塊尺寸字段用來記錄塊中所包含的字節(jié)數,不包括塊尺寸字段本身和塊結束符。它的設置便于跳過某個塊,該尺寸設置后不能改變。數據塊和子塊的長度是可變的,以適應數據量的變化。
六、gif作為內嵌的協(xié)議
作為一個內嵌的協(xié)議,gif屬于某個更大的應用協(xié)議的一部分,在這個應用協(xié)議中gif用于成象。因此,應用協(xié)議可以將gif數據流定義在一個數據塊中。當應用程序遇到一個gif類型的數據塊時就調用gif解碼器。使用gif擴展名來識別gif數據流的方法是一種較為有效的方法。
七、數據子塊
a. 數據子塊是一些包含數據的單元。這些單元沒有標簽,被當作控制塊的內容進行處理。數據子塊中的第一個字節(jié)指示其后的數據長度(0~255),長度信息不包括這個長度字節(jié)。
b. 必須的版本號:87a
c. 句法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 塊尺寸 字節(jié)
+---------------+
1 | |
+- -+
2 | |
+- -+
3 | |
+- -+
| | 數據值 字節(jié)
. +- -+
. | |
. +- . . . . -+
. | |
+- -+
| |
+- -+
255 | |
+---------------+
d. 擴充和域:該類型的塊總是作為其他更大塊的一部分,它沒有自己的作用域。
八、塊終止符
a. 這是一個零長度的數據子塊,用于說明前一個子塊的結束。它只包含一個字節(jié)的塊尺寸字段,其值為0,沒有數據。
b. 必須的版本:87a
九、頭部
a. 頭部用于在上下文中識別gif 數據流。標記字段表明數據流的開始,版本字段用來標識一個解碼器能夠完整處理該數據流所需的功能集。此塊是必須的,并且每個數據流只有一個頭部。必須出現在數據流的開始。
b. 句法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 標識符 3 字節(jié)
+- -+
1 | |
+- -+
2 | |
+---------------+
3 | | 版本 3 字節(jié)
+- -+
4 | |
+- -+
5 | |
+---------------+
i) 標識符 - 包含gif三個字符。
ii)版本 - 版本號為:87a或89a
iii) 擴充和域 - 該塊的域為整個數據流。該塊不能被任何擴充來改變。
十、邏輯視屏描述塊
a. 邏輯視屏描述符包含用于定義顯示設備的區(qū)域的參數。該塊中的坐標以虛擬屏幕的左上角為基準,而不需要參考顯示設備的絕對坐標。該塊是必須的,并且每個數據流只能有一個邏輯視屏描述塊。該塊緊接著頭部出現。
b. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 邏輯屏幕寬 Unsigned
+- -+
1 | |
+---------------+
2 | | 邏輯屏幕高 Unsigned
+- -+
3 | |
+---------------+
4 | | | | | <Packed Fields> See below
+---------------+
5 | | 背景色索引 Byte
+---------------+
6 | | 象素高寬比 Byte
+---------------+
<Packed Fields> = 全局色表標志 1 Bit
顏色方案 3 Bits
短標志 1 Bit
全局色表尺寸 3 Bits
i) 全局色表標志 - 指示有沒有全局色表,如果該標志位置1,則全局色表會緊接在該塊之后出現。該位也用于解釋是否選用背景顏色索引字段。若該位置1,則背景顏色索引字段的值將指向背景顏色表。
ii) 色彩方案 - 提供給原始圖像的每個顏色的位數減1。這個值代表圖像中所使用的整個調色板的大小,而不是圖像中所使用的顏色的數量。例如,若該字段的值為3,則圖像中所使用的調色板的每個色值占4位。
iii) 短標志 - 表明全局色表是否被排序。如果該位置1,則全局色表按照重要性遞減的原則進行了排序。典型地,是按照顏色的使用頻度進行遞減排序,使用頻度最高的顏色排在色表的最前面。這樣便可幫助解碼器選擇最好的顏色子集來成象。
iv) 全局色表的尺寸 - 如果全局色表標志位置1,則該字段的值記錄全局色表中所占用的字節(jié)數。
v) 背景顏色索引 - 為背景顏色指向全局色表。背景顏色是指那些沒有背圖像覆蓋的視屏部分的顏色。若全局色表標志位置為0,則該字段也被值0,并且被忽略。
vi) 象素高寬比 - 用于計算原圖像中像素的近似高寬比。如果該字段的值為非0,則象素的高寬比由下面的公式計算。
高寬比 = (象素高寬比 + 15) / 64
該字段的取值范圍從最寬的比值4:1到最高的比值1:4,遞增的步幅為1/64。
取值: 0 - 沒有比值
1~255 - 用于計算的值
c. 擴充和域。該塊的作用域為整個數據流。它不能被任何擴充來改變。
十一、全局色表
a. 該塊包含一個按照字節(jié)順序表示紅-綠-蘭三元色的色表。全局色表用于那些沒有局部色表的圖像和純文本擴充。在邏輯視屏描述塊中的全局色表標志位置1時表示有全局色表。全局色表緊接在邏輯視屏描述塊之后,占用的字節(jié)數為:
3*2^(全局色表尺寸+1)
b. 必須的版本:87a
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+===============+
0 | | Red 0 Byte
+- -+
1 | | Green 0 Byte
+- -+
2 | | Blue 0 Byte
+- -+
3 | | Red 1 Byte
+- -+
| | Green 1 Byte
+- -+
up | |
+- . . . . -+ ...
to | |
+- -+
| | Green 255 Byte
+- -+
767 | | Blue 255 Byte
+===============+
d.擴充和域:該塊的作用域為整個數據流。它不能被任何擴充來改變。
十二、圖像描述符
a. 數據流中的每一幅圖像都由一個圖像描述符、一個可選的局部色表和圖像數據組成。每一幅圖像必須在邏輯視屏描述塊中所定義的邏輯視屏界限之內。圖像描述符包含處理一個基于圖像的表的必要參數。在這個塊中給定的坐標是參照邏輯視屏的像素坐標。該塊是一個成象塊,在其前面可以選擇加上一個或多個控制塊,如:圖像控制擴充,或者是后面接有局部色表;圖像描述符后面總是圖像數據。它是一幅圖所必需的。一幅圖像對應一個圖像描述符。一個數據流中的圖像數目不做限制。
b. 必須的版本號:87a
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 圖象分隔符 Byte
+---------------+
1 | | 圖象左坐標 Unsigned
+- -+
2 | |
+---------------+
3 | | 圖象頂坐標 Unsigned
+- -+
4 | |
+---------------+
5 | | 圖象寬度 Unsigned
+- -+
6 | |
+---------------+
7 | | 圖象高度 Unsigned
+- -+
8 | |
+---------------+
9 | | | | | | <Packed Fields> See below
+---------------+
<Packed Fields> = 局部色表標志 1 Bit
隔行處理標志 1 Bit
短標志 1 Bit
保留 2 Bits
局部色表尺寸 3 Bits
i)圖像分隔符 - 用于識別圖像描述符的開始。取固定值0x2c。
d. 擴充和域:該塊的域是基于表的圖像。該塊可以被圖像控制擴充所改變。
十三、局部色表
a. 該塊包含一個按照紅-綠-蘭三原色的順序排列的色表。該表作用于緊跟其后的圖像。當局不色表標志位置1時,該表出現,且其后緊跟圖像的描述符,它所包含的字節(jié)數等于
3*2^(局部色表尺寸+1)
b. 必須的版本:87a
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+===============+
0 | | Red 0 Byte
+- -+
1 | | Green 0 Byte
+- -+
2 | | Blue 0 Byte
+- -+
3 | | Red 1 Byte
+- -+
| | Green 1 Byte
+- -+
up | |
+- . . . . -+ ...
to | |
+- -+
| | Green 255 Byte
+- -+
767 | | Blue 255 Byte
+===============+
d. 擴充及域:該塊的域是緊跟其后的基于表的圖像數據塊。該塊不能被任何擴充所改變。
十四、基于表的圖像數據
a. 對一個基于表的圖像數據由一系列子塊組成,每個子塊最多255
字節(jié),包含一個為圖中每個象素所指定的有效色表的索引。索引的順序用LZW算法進行編碼。
b. 必須的版本:87a
c. 語法
圖像數據的格式如下圖所示
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
| | LZW 最小編碼尺寸 Byte
+---------------+
+===============+
| |
/ / 圖象數據 數據子塊
| |
+===============+
i) LZW 最小編碼尺寸:該字節(jié)用于決定在圖像數據中用 LZW 編碼最初的位數。
e. 擴充和域:該塊沒有域,它包括格柵數據。要改變基于表格的圖像的擴充必須在相應的圖像描述符之前出現。
十五、圖像控制擴充
a. 圖像控制擴充包含在處理一個成象塊時所需的參數。擴充只包括一個數據子塊。該塊是可選的。通常只有一個圖像控制擴充在成象塊之前。這也是在一個數據流中對成象控制擴充的唯一限制。
b. 必須的版本:89a
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 擴充導入符 Byte
+---------------+
1 | | 圖象控制標記 Byte
+---------------+
+---------------+
0 | | 塊尺寸 Byte
+---------------+
1 | | | | | <Packed Fields> See below
+---------------+
2 | | 延長時間 Unsigned
+- -+
3 | |
+---------------+
4 | | 透明顏色索引 Byte
+---------------+
+---------------+
0 | | 塊結束 Byte
+---------------+
<Packed Fields> = 保留 3 Bits
配置方法 3 Bits
用戶輸入標志 1 Bit
透明顏色標志 1 Bit
i) 擴充引入 - 用于識別一個擴充塊的開始,該字段為固定值0x21。
ii)圖像控制標號 - 識別當前塊是否為圖形控制擴充。該字段為固定值 0xF9。
iii) 塊尺寸 - 塊中所包含的字節(jié)數。從塊尺寸字段開始到快結束符(不含結束符)。該字段包含固定值4。
iv) 配置方法 - 指示圖像顯示后的處理方法。
值: 0 - 無指定的配置,解碼器不需要做任何處理。
1 - 不做配值。圖像將被留在原位置。
2 - 恢復背景顏色。圖像所占的區(qū)域必須備恢復為背景顏色。
3 - 恢復以前的顏色。解碼器需要將圖像區(qū)域恢復為原來成象的顏色。
4-7 - 未定義。
v)用戶輸入標志 - 說明在繼續(xù)處理之前是否需要用戶輸入。可以和輸入延時一起使用。
vi) 透明標志 - 表明在透明索引字段是否給定透明索引。
vii) 延時 - 如果不為0, 該字段指定以1/100秒為單位的時延數。
viii) 透明索引 - 如果遇到透明索引,則顯示設備的相關象素不被改變,繼續(xù)處理下一個象素。
ix) 塊終止符 - 這個0長度字段標志著圖像控制擴充得結束。
d. 擴充和域:該擴充的域是其后的成象塊;在該塊和它的作用塊之間可以由其他擴充。該塊可以改變圖像描述塊和純文本擴充。
e. 建議:i)配置方法 - 恢復到原先的方法廠用于圖像中的一些小區(qū)域;用該方法強制使解碼器存儲需要保留的圖像區(qū)域,因此該方法要慎用。該方法并非為整個圖像或大區(qū)域的圖像所設置。
ii) 用戶輸入標志 - 當該標志被設置時,解碼器會用(0x07)來激活聲音來提醒用戶輸入數據。如果沒有設定延時,則解碼器會一直等待用戶的輸入。
十六、注釋擴充
a. 注釋擴充包含實際不屬于gif數據流的文本信息。它適用于包括圖像注釋、描述或者任何其他非控制和非圖像數據。注釋擴充將被解碼器忽略,或者被保留到以后處理。在任何情況下注釋擴充也不能中斷對數據流的處理。該塊是可選的;在數據流中的出現量不加限制。
b. 必須的版本:89a
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 擴充導入符 Byte
+---------------+
1 | | 注釋標記 Byte
+---------------+
+===============+
| |
N | | 注釋數據 數據子塊
| |
+===============+
+---------------+
0 | | 塊結束符 Byte
+---------------+
i) 擴充導入符 - 標識擴充的開始。該字段為固定值0x21。
ii) 注釋標號 - 標示某塊為注釋擴充。該段為固定值0xFE。
iii) 注釋數據 - 按照子塊順序,每個注釋最少1字節(jié)最多255字節(jié)。序列結尾用塊結束符標識。
iv) 塊結束符 - 這個零長度數據塊用來標識注釋擴充的結束。
d. 擴充和域:該塊沒有域,且不能被任何擴充修改。
e. 建議
i) 數據 - 該塊為方便使用所設。它使用7位ASCII碼字符集。不能用于存儲控制信息。
ii) 位置 - 該塊可以出現在數據流中的任何地方。建議該塊盡量在數據流的開始或者結尾。
十七、純文本擴充
a. 純文本擴充包括純文本數據和將數據顯示為圖像所必需的參數。文本數據將用7位可印刷ASCII碼字符編碼。文本數據用在塊字段中定義的單元格字符元素來成象。每個字符用一個單元成象。為單色字符,用最合適的字型、字號。字符格包含單元的數量,剩余不足成為格子的部分要丟棄。編碼器應精確測算,以避免剩余現象出現。該塊使用全局色表。它可以被圖形控制擴充來修改。該塊為可選塊。
b. 必須的版本:89a。
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 擴充導入符 Byte
+---------------+
1 | | 純文本標記 Byte
+---------------+
+---------------+
0 | | 塊尺寸 Byte
+---------------+
1 | | 文本格左坐標 Unsigned
+- -+
2 | |
+---------------+
3 | | 文本格頂坐標 Unsigned
+- -+
4 | |
+---------------+
5 | | 文本格寬度 Unsigned
+- -+
6 | |
+---------------+
7 | | 文本格高度 Unsigned
+- -+
8 | |
+---------------+
9 | | 字符單元寬度 Byte
+---------------+
10 | | 字符單元高度 Byte
+---------------+
11 | | 文本前景色索引 Byte
+---------------+
12 | | 文本背景色索引 Byte
+---------------+
+===============+
| |
N | | 純文本數據 數據子塊
| |
+===============+
+---------------+
0 | | 塊結束符 Byte
+---------------+
i) 擴充導入符 - 標識一個擴充塊的開始。取固定值0x21.
ii) 純文本標記 - 標識當前塊為原文擴充。取固定值0x01.
iii) 塊尺寸 - 擴充中的字節(jié)數,取固定值12.
iv) 文本格左位置 - 邏輯視屏的左邊,用象素表示的左邊列數,
v) 文本格頂位置 - 邏輯視屏的上邊,用象素表示的上邊行數。
xii) 原文數據 - 子塊序列,每個子塊最少1字節(jié)最多255字節(jié)。該序列遇到塊結束符時結束。
xiii) 塊結束符 - 這個0長度數據塊用來標志塊結束。
d. 擴充和域:該塊的域是包含其中的原文字數據。它可以被圖像控制擴充來修改。
e. 建議
在原文擴充中的數據是提前格式化好的。對字型、字號的選擇由解碼器來定。如果遇到小于0x20 或者大于0xf7 的字符,解碼器將按空格0x20來處理。為了最廣泛地兼容,字符單元應該為8*8或8*16點陣。
十八、應用擴充
a. 應用擴充包含應用說明信息;它遵守如下所述的擴充塊的語法,塊標記為0xff.
b. 必須的版本:89a
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | 擴充導入符 Byte
+---------------+
1 | | 擴充標記 Byte
+---------------+
+---------------+
0 | | 塊尺寸 Byte
+---------------+
1 | |
+- -+
2 | |
+- -+
3 | | 應用標識符 8 Bytes
+- -+
4 | |
+- -+
5 | |
+- -+
6 | |
+- -+
7 | |
+- -+
8 | |
+---------------+
9 | |
+- -+
10 | | 應用證明碼 3 Bytes
+- -+
11 | |
+---------------+
+===============+
| |
| | 應用數據 數據子塊
| |
| |
+===============+
+---------------+
0 | | 塊結束符 Byte
+---------------+
i) 擴充引入符 - 定義該塊位擴充塊。取固定值0x21.
ii) 應用擴充標記 - 標識該塊為應用擴充塊。取固定值0xFF.
iii) 塊尺寸 - 指示該塊中包含的字節(jié)數。取固定值11.
iv) 應用標識符 - 8格可印刷ASCII字符用來標識該應用所屬的應用擴充。
v) 應用證明碼 - 3格字節(jié)的序列用于證明應用標識符。一個應用程序可以一種算法來計算一個二進制碼來唯一地識別這個應用是否數于這個應用擴充。
d. 擴充和域:該塊沒有域,且不能被其他擴充所修改。
十九、尾記錄
a. 該塊為一個單字段塊,用來指示該數據流的結束。取固定值0x3b.
b. 必須的版本:87a。
c. 語法
7 6 5 4 3 2 1 0 字段名 類型
+---------------+
0 | | GIF 尾記錄 Byte
+---------------+
d.擴充和域:該塊沒有域,它用于結束gif 數據流。它不能被任何擴充所修改。
附錄A. 快速參照表.
塊名稱 必須項 標記 擴充 版本
應用擴充 可選 (*) 0xFF (255) 是 89a
注釋擴充 可選 (*) 0xFE (254) 是 89a
全局色表 可選 (1) 無 否 87a
圖像控制擴充 可選 (*) 0xF9 (249) 是 89a
頭部 必須 (1) 無 否 N/A
圖象描述符 可選 (*) 0x2C (044) 否 87a (89a)
局部色表 可選 (*) 無 否 87a
邏輯視屏描述塊 必須 (1) 無 否 87a (89a)
純文本擴充 可選 (*) 0x01 (001) 是 89a
尾記錄 必須 (1) 0x3B (059) 否 87a
無標記塊
頭部 必須 (1) 無 否 N/A
邏輯視屏描述符 必須 (1) 無 否 87a (89a)
全局色表 可選 (1) 無 否 87a
局部色表 可選 (*) 無 否 87a
成象塊
純文本擴充 可選 (*) 0x01 (001) 是 89a
圖像描述符 可選 (*) 0x2C (044) 否 87a (89a)
控制塊
圖象控制擴充 可選 (*) 0xF9 (249) 是 89a
特殊用途塊
尾記錄 必須 (1) 0x3B (059) 否 87a
注釋擴充 可選 (*) 0xFE (254) 是 89a
應用擴充 可選 (*) 0xFF (255) 是 89a
圖例: (1) 如果出現,最多發(fā)生一個
(*) 0個或者多個發(fā)生
(+) 一個或者多個發(fā)生
注 : 頭部不受版本號的制約。
89a版的邏輯視屏描述塊及圖象描述符保留它們從87a版到89a版的語法,不過有的字段 在87a版是保留項,但是在89a版這為有用項。
附錄B. GIF 語法.
語法是用來表達序列的一種符號形式,并用這個表達序列中的一些對象來形成更大的對象。語法也用于表達在給定的位置出現對象的數目。在此給出的語法用來說明形成gif數據流的塊序列,用一些規(guī)則列表來表達。下面列出用于gif語法的符號定義。
圖例: <> 語法詞
::= 符號定義
* 0個或更多的事件發(fā)生
+ 1個或更多的事件發(fā)生
| 替代元素
[] 可選元素
例子:
<GIF 數據流> ::= 頭部 <邏輯視屏> <數據>* 尾記錄
這個規(guī)則將<Gif 數據流>實體定義如下。它必須以頭部開始,頭部后面接一個邏輯視屏 實體,該實體藥用其他規(guī)則來定義。最后,數據實體接結束符。數據實體后面的*表示數據實體可以在此位置出現0或多次。
語法
<Gif 數據流> ::= 頭部 <邏輯視屏> <數據>* 尾記錄
<邏輯視屏> ::= 邏輯視屏描述塊 [全局色表]
<數據> ::= <成象塊> |
<特殊用途塊>
<成象塊> ::= [圖象控制擴充] <成象塊>
<成象塊> ::= <基于表的圖象> |
純文本擴充
<Table-Based Image> ::= 圖象描述符 [局部色表] 圖象數據
<特殊用途塊> ::= 應用擴充 |
注釋擴充