簡介:
GIF(Graphics Interchange Format)是CompuServe公司開發的圖像文件存儲格式,1987年開發的GIF文件格式版本號是GIF87a,1989年進行了擴充,擴充後的版本號定義爲GIF89a。
GFI圖像文件以數據塊(block)爲單位來存儲圖像的相關信息。一個GIF文件由表示圖形/圖像的數據塊、數據子塊以及顯示圖形/圖像的控制信息塊組成,稱爲GIF數據流(Data
Stream)。數據流中的所有控制信息塊和數據塊都必須在文件頭(Header)和文件結束塊(Trailer)之間。
GIF文件格式採用了LZW(Lempel-Ziv Walch)壓縮算法來存儲圖像數據,定義了允許用戶爲圖像設置背景的透明(transparency)屬性。此外,GIF文件格式可在一個文件中存放多幅彩色圖形/圖像。如果在GIF文件中存放有多幅圖,它們可以像演幻燈片那樣顯示或者像動畫那樣演示。
GIF 語法.
語法是用來表達序列的一種符號形式,並用這個表達序列中的一些對象來形成更大的對象。語法也用於表達在給定的位置出現對象的數目。在此給出的語法用來說明形成gif數據流的塊序列,用一些規則列表來表達。下面列出用於gif語法的符號定義。
圖例: <> 語法詞
::= 符號定義
* 0個或更多的事件發生
+ 1個或更多的事件發生
| 替代元素
[] 可選元素
gif語法的符號定義:
<GIF 數據流> ::= 頭部 <邏輯視屏>
<數據>* 尾記錄
這個規則將<Gif 數據流>實體定義如下。它必須以頭部開始,頭部後面接一個邏輯視屏實體,該實體藥用其他規則來定義。最後,數據實體接結束符。數據實體後面的*表示數據實體可以在此位置出現0或多次。
語法:
<Gif 數據流> ::= 頭部 <邏輯視屏>
<數據>* 尾記錄
<邏輯視屏> ::= 邏輯視屏描述塊 [全局色表]
<數據> ::= <成象塊>
|<特殊用途塊>
<成象塊> ::= [圖象控制擴充]
<成象塊>
<成象塊> ::= <基於表的圖象>
|純文本擴充
<基於表的圖象> ::= 圖象描述符 [局部色表] 圖象數據
<特殊用途塊> ::= 應用擴充 |注釋擴充
gif數據流中的數據塊可以分爲三組:控制塊、成象塊和特殊用途塊。
控制塊,如:頭部、邏輯視屏描述塊、圖像控制擴充和尾記錄,包含用於控制處理數據流或設置硬件參數的信息。
成像塊,如:圖像描述符和純文本擴充,包含用於在顯示設備上成像的信息和數據。
特殊用途塊,如:注釋擴充和應用擴充,包含那些既不用於處理數據流也不用於在顯示設備上成象的信息。
除了邏輯視屏描述塊和全局色表之外,特殊用途塊的作用域是整個數據流,而其他控制塊的作用域是有限的,僅限於對他們後面的成象塊起作用。特殊用途塊不對任何控制塊構成限制,它對於解碼過程來說是透明的。成象塊及擴充用於控制塊及擴充的作用域限定。塊的標記分爲三段:除尾記錄0x3b之外,0x00~0x7f用於成象塊;0x80~0xf9用於控制塊;0xfa~0xff用於特殊用途塊。解碼器通過識別塊標記來處理塊的作用域。
解釋:
色表- gif格式利用色表來顯示基於光柵的圖像。色表分爲全局色表和局部色表。全局色表對於那些沒有設置局部色表的圖像起作用。全局色表的作用域是整個數據流。局部色表對於緊接在其後的單張圖像起作用。這兩種色表都是可選的。
/*
全局色表這東西是我們感興趣的東西,它有點像png格式定義種的調色板,如果要修改gif圖片的顏色,哈哈,修改這個全局色表就可以.如果有全局色表塊,那麼它一定從gif流的14個字節開始(頭部6個 + 邏輯視頻描述塊7個)。
*/
以下是各數據塊的說明,如果註明爲版本89a的話,則說明這個數據塊不會在87a版的協議中出現.
頭部(6個字節)
標識符(3 字節)
---GIF
版本(3 字節) ---87a
(or 89a)
邏輯視屏描述塊
邏輯屏幕寬(2字節)
邏輯屏幕高(2字節)
Packed Fields (1字節)
背景色索引(1字節)
象素高寬比(1字節)
Packed Fields說明:
全局色表標志 1 Bit
顏色方案 3 Bits
短標志 1 Bit
全局色表尺寸 3 Bits
解釋:
背景顏色索引 - 爲背景顏色指向全局色表。背景顏色是指那些沒有背圖像覆蓋的視屏部分的顏色。若全局色表標志位置爲0,則該字段也被值0,並且被忽略。
象素高寬比 - 用於計算原圖像中像素的近似高寬比。如果該字段的值爲非0,則象素的高寬比由下面的公式計算:
高寬比 = (象素高寬比 +
15) / 64
該字段的取值範圍從最寬的比值4:1到最高的比值1:4,遞增的步幅爲1/64。
取值: 0 - 沒有比值,1~255
- 用於計算的值。
全局色表標志 - 指示有沒有全局色表,如果該標志位置1,則全局色表會緊接在該塊之後出現。該位也用於解釋是否選用背景顏色索引字段。若該位置1,則背景顏色索引字段的值將指向背景顏色表。
色彩方案 - 提供給原始圖像的每個顏色的位數減1。這個值代表圖像中所使用的整個調色板的大小,而不是圖像中所使用的顏色的數量。例如,若該字段的值爲3,則圖像中所使用的調色板的每個色值佔4位。
短標志 - 表明全局色表是否被排序。如果該位置1,則全局色表按照重要性遞減的原則進行了排序。典型地,是按照顏色的使用頻度進行遞減排序,使用頻度最高的顏色排在色表的最前面。這樣便可幫助解碼器選擇最好的顏色子集來成象。
全局色表的尺寸 - 如果全局色表標志位置1,則該字段的值記錄全局色表中所佔用的字節數。
全局色表
該塊包含一個按照字節順序表示紅-綠-藍三元色的色表。全局色表用於那些沒有局部色表的圖像和純文本擴充。在邏輯視屏描述塊中的全局色表標志位置1時表示有全局色表。全局色表緊接在邏輯視屏描述塊之後,佔用的字節數爲:
3*2^(全局色表尺寸+1)
數據組成格式爲:
Red 0
Green 0
Blue 0
……
Red n
Green n
Blue n
圖像控制擴充(版本-89a)
圖像控制擴充包含在處理一個成象塊時所需的參數。擴充只包括一個數據子塊。該塊是可選的。通常只有一個圖像控制擴充在成象塊之前。這也是在一個數據流中對成象控制擴充的唯一限制。
數據組成格式爲:
擴充導入符(1字節)
圖象控制標記(1字節)
塊尺寸(1字節)
<Packed Fields>
延長時間(2字節)
透明顏色索引(1字節)
塊結束(1字節)
Packed Fields說明:
保留 3 Bits
配置方法 3 Bits
用戶輸入標志 1
Bit
透明顏色標志 1
Bit
解釋:
擴充引入 - 用於識別一個擴充塊的開始,該字段爲固定值0x21。
圖像控制標號 - 識別當前塊是否爲圖形控制擴充。該字段爲固定值 0xF9。
塊尺寸 - 塊中所包含的字節數。從塊尺寸字段開始到快結束符(不含結束符)。該字段包含固定值4。
配置方法 - 指示圖像顯示後的處理方法。值:
0 - 無指定的配置,解碼器不需要做任何處理。
1 - 不做配值。圖像將被留在原位置。
2 - 恢復背景顏色。圖像所佔的區域必須備恢復爲背景顏色。
3 - 恢復以前的顏色。解碼器需要將圖像區域恢復爲原來成象的顏色。
4-7 - 未定義。
用戶輸入標志 - 說明在繼續處理之前是否需要用戶輸入。可以和輸入延時一起使用。
透明標志 - 表明在透明索引字段是否給定透明索引。
延時 - 如果不爲0, 該字段指定以1/100秒爲單位的時延數。
透明索引 - 如果遇到透明索引,則顯示設備的相關象素不被改變,繼續處理下一個象素。
塊終止符 - 這個0長度字段標志着圖像控制擴充得結束。
圖像描述符
每一幅圖像必須在邏輯視屏描述塊中所定義的邏輯視屏界限之內。圖像描述符包含處理一個基於圖像的表的必要參數。在這個塊中給定的坐標是參照邏輯視屏的像素坐標。該塊是一個成象塊,在其前面可以選擇加上一個或多個控制塊,如:圖像控制擴充,或者是後面接有局部色表;圖像描述符後面總是圖像數據。它是一幅圖所必需的。一幅圖像對應一個圖像描述符。
數據組成格式爲:
圖象分隔符(1字節)
圖象左坐標(2字節)
圖象頂坐標(2字節)
圖象寬度(2字節)
圖象高度(2字節)
(2字節)
<Packed Fields>(1字節)
Packed Fields說明:
局部色表標志 1 Bit
隔行處理標志 1
Bit
短標志 1 Bit
保留 2 Bits
局部色表尺寸 3 Bits
解釋:
圖像分隔符 - 用於識別圖像描述符的開始。取固定值0x2c
局部色表
該塊包含一個按照紅-綠-蘭三原色的順序排列的色表。該表作用於緊跟其後的圖像數據。當局不色表標志位置1時,該表出現,且其後緊跟圖像的描述符,它所包含的字節數等於
3*2^(局部色表尺寸+1)
數據組成格式爲:
Red 0
Green 0
Blue 0
……
Red n
Green n
Blue n
基於表的圖像數據
基於表的圖像數據由一系列子塊組成,每個子塊最多255字節,包含一個爲圖中每個象素所指定的有效色表的索引。索引的順序用LZW算法進行編碼。
數據組成格式爲:
LZW 最小編碼尺寸(1字節)
圖象數據數據子塊(n字節)
解釋:
LZW 最小編碼尺寸:該字節用於決定在圖像數據中用 LZW 編碼最初的位數。
注釋擴充(版本-89a)
注釋擴充包含實際不屬於gif數據流的文本信息。它適用於包括圖像注釋、描述或者任何其他非控制和非圖像數據。注釋擴充將被解碼器忽略,或者被保留到以後處理。在任何情況下注釋擴充也不能中斷對數據流的處理。該塊是可選的;在數據流中的出現量不加限制。
數據組成格式爲:
擴充導入符(1字節)
注釋標記(1字節)
注釋數據數據子塊(n字節)
塊結束符(1字節)
解釋:
擴充導入符 - 標識擴充的開始。該字段爲固定值0x21。
注釋標號 - 標示某塊爲注釋擴充。該段爲固定值0xFE。
注釋數據 - 按照子塊順序,每個注釋最少1字節最多255字節。序列結尾用塊結束符標識。
塊結束符 -用來標識注釋擴充的結束。
純文本擴充(版本-89a)
純文本擴充包括純文本數據和將數據顯示爲圖像所必需的參數。文本數據將用7位可印刷ASCII碼字符編碼。文本數據用在塊字段中定義的單元格字符元素來成象。每個字符用一個單元成象。該塊使用全局色表。它可以被圖形控制擴充來修改。該塊爲可選塊。
數據組成格式爲:
擴充導入符(1字節)
純文本標記(1字節)
塊尺寸(1字節)
文本格左坐標(2字節)
文本格頂坐標(2字節)
文本格寬度(2字節)
文本格高度(2字節)
字符單元寬度(1字節)
字符單元寬度(1字節)
文本前景色索引(1字節)
文本背景色索引(1字節)
純文本數據數據子塊(n字節)
塊結束符(1字節)
解釋:
擴充導入符 - 標識一個擴充塊的開始。取固定值0x21.
純文本標記 - 標識當前塊爲原文擴充。取固定值0x01.
塊尺寸 - 擴充中的字節數,取固定值12.
文本格左位置 - 邏輯視屏的左邊,用象素表示的左邊列數,
文本格頂位置 - 邏輯視屏的上邊,用象素表示的上邊行數。
原文數據 - 子塊序列,每個子塊最少1字節最多255字節。該序列遇到塊結束符時結束。
塊結束符– 0,用來標志塊結束。
應用擴充(版本-89a)
應用擴充包含應用說明信息;它遵守如下所述的擴充塊的語法,塊標記爲0xff.
數據組成格式爲:
擴充導入符(1字節)
擴充標記(1字節)
塊尺寸(2字節)
應用標識符(8字節)
應用證明碼(3字節)
應用數據數據子塊(n字節)
塊結束符(1字節)
解釋:
擴充引入符 - 定義該塊位擴充塊。取固定值0x21.
應用擴充標記 - 標識該塊爲應用擴充塊。取固定值0xFF.
塊尺寸 - 指示該塊中包含的字節數。取固定值11.
應用標識符 - 8格可印刷ASCII字符用來標識該應用所屬的應用擴充。
應用證明碼 -
3格字節的序列用於證明應用標識符。一個應用程序可以一種算法來計算一個二進制碼來唯一地識別這個應用是否數於這個應用擴充。
尾記錄
該塊爲一個單字段塊,用來指示該數據流的結束。取固定值0x3b.