歷史
在早期,GIF所用的LZW壓縮算法
是Compuserv所開發的一種免費
算法。然而令很多軟體開發商感到意外的是,GIF檔案所採用的壓縮算法忽然成了Unisys公司的專利。
據Unisys公司稱,他們已註冊了LZW算法中的W部分。如果要開發生成(或顯示)GIF檔案的程式,則需向該公司支付版稅。由此,人們開始尋求一種新技術,以減少開發成本。
PNG(Portable Network Graphics,便攜網路圖形) 標準就在這個背景下應運而生了。它一方面滿足了市場對更少的法規限制的需要,另一方面也帶來了更少的技術上的限制,如顏色的數量等。
在2003年6月20日,LZW算法在美國的專利權已到期而失效。在歐洲、日本及加拿大的專利權亦已分別在2004年的6月18日、6月20日和7月7日到期失效。儘管如此,PNG檔案格式憑著其技術上的優勢,已然躋身於網路上第三廣泛套用格式。與GIF相關的專利於2006年8月11日過期。
分類
GIF 分為靜態GIF和動畫GIF兩種,擴展名為.gif,是一種壓縮點陣圖格式,支持透明背景圖像,適用於多種作業系統,“體型”很小,網上很多小動畫都是GIF格式。其實GIF是將多幅圖像保存為一個圖像檔案,從而形成動畫,最常見的就是通過一幀幀的動畫串聯起來的搞笑gif圖,所以歸根到底GIF仍然是圖片檔案格式。
但GIF只能顯示256色。和jpg格式一樣,這是一種在網路上非常流行的圖形檔案格式。
GIF 主要分為兩個版本,即GIF 89a和GIF 87a
GIF 87a:是在1987年制定的版本
GIF 89a:是1989年制定的版本。在這個版本中,為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個位元組)
標識符(Signature)(3位元組) ---GIF
版本(3位元組) ---87a (or 89a)
邏輯視屏描述塊
邏輯螢幕寬(2位元組)
邏輯螢幕高(2位元組)
Packed Fields (1位元組)
背景色索引(1位元組)
象素高寬比(Aspect Ratio)(1位元組)
Packed Fields說明:
全局色表(Global Color Map)標誌 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 (1位元組)
延長時間(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位元組)
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.
製作
PC上製作軟體主要為Adobe ImageReady 和 fireworks 兩個。
WEB上gif線上製作編輯gif5.net,支持圖片、視頻、FLASH轉GIF。