GIF(Graphics Interchange Format) 的原義是“ 圖像 互換格式”,是 CompuServe 公司在 1987年開發的 圖像文件格式 。GIF文件的數據,是壹種基於 LZW算法 的連續色調的無損 壓縮格式 。其 壓縮率 壹般在 50% 左右,它不屬於任何應用 程序 。GIF格式可以存多幅彩色圖像,如果把存於壹個文件中的多幅 圖像數據 逐幅讀出並顯示到屏幕上,就可構成壹種最簡單的動畫。
GIF圖象是基於顏色列表的(存儲的數據是該點的顏色對應於顏色列表的索引值),最多只支持8位(256色)。GIF文件內部分成許多存儲塊,用來存儲多幅圖象或者是決定圖象表現行為的控制塊,用以實現動畫和交互式應用。GIF文件還通過LZW壓縮算法壓縮圖象數據來減少圖象尺寸。
GIF格式自1987年由 CompuServe 公司引入後,因其體積小、成像相對清晰,特別適合於初期慢速的 互聯網 ,而大受歡迎。
在早期, 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日過期。
長久以來,iOS壹直被吐槽不能用GIF。造成這壹局面的主要原因是:
GIF分為靜態GIF和動畫GIF兩種,擴展名為.gif,是壹種壓縮 位圖 格式,支持透明 背景圖像 ,適用於多種操作系統,“體型”很小,網上很多小動畫都是GIF格式。其實GIF是將多幅圖像保存為壹個圖像文件,從而形成動畫,最常見的就是通過壹幀幀的動畫串聯起來的搞笑gif圖,所以歸根到底GIF仍然是 圖片文件格式 。
但GIF只能顯示256色。和 jpg格式 壹樣,這是壹種在網絡上非常流行的圖形文件格式。
GIF主要分為兩個版本,即 GIF 89a 和 GIF 87a
此給出的語法用來說明形成gif 數據流 的塊序列,用壹些規則列表來表達。下面列出用於gif語法的符號定義。
gif語法的符號定義:<GIF 數據流 > ::= 頭部 <;邏輯視屏> <;數據>* 尾記錄
gif 數據流 中的 數據塊 可以分為三組:控制塊、成象塊和特殊用途塊。
色表- gif格式利用色表來顯示基於光柵的圖像。色表分為全局色表和局部色表。全局色表對於那些沒有設置局部色表的圖像起作用。全局色表的作用域是整個 數據流 。局部色表對於緊接在其後的單張圖像起作用。這兩種色表都是可選的。
全局色表這東西是我們感興趣的東西,它有點像png格式定義種的調色板,如果要修改gif圖片的顏色,哈哈,修改這個全局色表就可以,如果有全局色表塊,那麽它壹定從gif流的14個字節開始(頭部6個 + 邏輯視頻描述塊7個)。
以下是各 數據塊 的說明,如果註明為版本89a的話,則說明這個數據塊不會在87a版的協議中出現。
Packed Fields 說明:
GIF文件內部是按塊劃分的,包括 控制塊( Control Block ) 和 數據塊(DataSub-blocks) 兩種。控制塊是控制數據塊行為的,根據不同的控制塊包含壹些不同的控制參數;數據塊只包含壹些8-bit的字符流,由它前面的控制塊來決定它的功能,每個數據塊大小從0到255個字節,數據塊的第壹個字節指出這個數據塊大小(字節數),計算數據塊的大小時不包括這個字節,所以壹個空的數據塊有壹個字節,那就是數據塊的大小0x00。 下表是壹個數據塊的結構:
壹個GIF文件的結構可分為文件頭(File Header)、GIF數據流(GIF DataStream)和文件終結器(Trailer)三個部分。文件頭包含GIF文件署名(Signature)和版本號(Version);GIF數據流由控制標識符、圖象塊(ImageBlock)和其他的壹些擴展塊組成;文件終結器只有壹個值為0x3B的字符('';'')表示文件結束。下表顯示了壹個GIF文件的組成結構:
是用來標識GIF署名(Signature)和版本號(Version)的。
GIF署名用來確認壹個文件是否是GIF格式的文件,這壹部分由三個字符組成:"GIF";文件版本號也是由三個字節組成,可以為"87a"或"89a"。具體如下圖所示。
它包含了很多的部分。
(1) 邏輯屏幕標識符 (Logical Screen Descriptor) :這壹部分由7個字節組成,定義了GIF圖象的大小 (Logical Screen Width &Height) 、顏色深度 (Color Bits) 、背景色 (Blackground ColorIndex) 以及有無全局顏色列表 (Global Color Table) 和顏色列表的索引數 (IndexCount) ,具體描述見下圖。
也可以參考下圖。
(2)全局顏色列表 (Global Color Table) :
全局顏色列表必須緊跟在邏輯屏幕標識符後面,每個顏色列表索引條目由三個字節組成,按R、G、B的順序排列。
(3)圖象標識符 (Image Descriptor) :壹個GIF文件內可以包含多幅圖象,壹幅圖象結束之後緊接著下是壹幅圖象的標識符,圖象標識符以0x2C('','')字符開始,定義緊接著它的圖象的性質,包括圖象相對於邏輯屏幕邊界的偏移量、圖象大小以及有無局部顏色列表和顏色列表大小,由10個字節組成,具體如下所示。
也可以參考下圖。
(4)局部顏色列表 (Local Color Table) :如果上面的局部顏色列表標誌置位的話,則需要在這裏(緊跟在圖象標識符之後)定義壹個局部顏色列表以供緊接著它的圖象使用,註意使用前應線保存原來的顏色列表,使用結束之後回復原來保存的全局顏色列表。如果壹個GIF文件即沒有提供全局顏色列表,也沒有提供局部顏色列表,可以自己創建壹個顏色列表,或使用系統的顏色列表。局部顏色列表的排列方式和全局顏色列表壹樣:RGBRGB......
(5) 基於顏色列表的圖象數據 (Table-Based Image Data) :由兩部分組成: LZW 編碼長度 (LZW Minimum Code Size) 和圖象數據 (Image Data) 。
下面給出總體的存儲結構的原理圖。
PC上制作軟件主要為 Adobe ImageReady 和 fireworks 兩個。
WEB上gif在線制作編輯 gif5.net ,支持 圖片 、視頻、FLASH轉GIF。
我壹般使用 LICEcap 制作gif圖。
1. 百度百科
2. GIF圖片的文件儲存結構和動畫原理
3. GIF圖片原理和儲存結構深入解析