你可能已經知道,GIF 是一種光柵圖像文件格式,它在不損失圖像質量的前提下提供壓縮功能,并且支持動畫和透明度。
GIF 是“Graphics Interchange Format(圖形交換格式)”的縮寫。由于其良好的兼容性以及在不同應用程序和操作系統之間的可移植性,這種格式變得非常流行。下面我們將深入了解 GIF 為什么如此通用,以及它的文件結構。同時,我們還會看看它的優點與缺點。
GIF 的結構
目前,GIF 文件有兩個版本:87a 和 89a。前者是最初的 GIF 格式,而后者是更新版本。GIF89a 添加了一些新功能,如動畫延遲、透明背景顏色、元數據存儲等。
GIF 文件的簡化結構由文件開頭的固定區域組成,緊隨其后的是若干個可變數量的數據塊。固定區域包括三個部分:
-
頭部(Header):標明 GIF 的版本。
-
全局屏幕描述符(Global Screen Descriptor):指定圖像的尺寸。
-
全局顏色表(Global Color Table):定義圖像中使用的顏色。
文件以圖像結束符(Trailer)結束。
GIF 文件結構
圖像塊(Image Block)中包含了壓縮的圖像數據等信息。GIF 以最多 8 位的像素編碼,并使用 RGB 顏色模型和調色板。像素數據通過一種稱為 LZW 的壓縮算法進行壓縮。GIF 的廣泛使用在很大程度上得益于該算法。即使在過去網速較慢的年代,LZW 也能讓大圖像快速加載。
LZW 壓縮算法
Lempel-Ziv-Welch(LZW)算法 由 Abraham Lempel 和 Jacob Ziv 提出,后由 Terry Welch 改進。這是一種無損壓縮算法,意味著壓縮過程中不會丟失任何信息。
它是一種基于字典的壓縮方法,即在原始數據中使用一個“字典”來記錄重復出現的序列。字典中的序列越長、重復越頻繁,壓縮效果就越好。
LZW 的核心思想是利用數據中的重復模式。算法在編碼和解碼過程中動態地構建一個字典。通常,字典中索引 0 到 255 表示單個字符,而大于 255 的索引表示編碼過程中出現的多個字符組成的序列。
LZW 壓縮的一般步驟如下:
-
準備一個包含所有單字符序列的初始字典。
-
查找當前輸入中在字典中匹配的最長序列,將其替換為字典中的索引。
-
將當前序列加上下一個輸入字符,作為新條目加入字典。
-
回到步驟 2。
注:下方的動畫 GIF 展示了 LZW 編碼過程的動畫演示。
解碼過程也很相似。它從壓縮的數據流中提取索引,并重新構建出同樣的字典。因此,不需要單獨傳輸字典,節省了寶貴的空間。
使用 GIF 格式的優勢
你可能知道,GIF 不僅可以存儲靜態圖像,還支持動畫。如今,網絡聊天中的小動畫和表情包幾乎都使用 GIF 格式。
其次,GIF 非常適合色彩數量有限的圖像,例如徽標(logo)。在這種情況下,LZW 壓縮能夠高效保存大塊單一顏色區域和清晰邊界。
最后,是透明度。在 GIF 中,某些幀可以將特定的調色板索引設置為“透明色”,這表示在動畫中,該像素位置將使用上一個幀中相同位置的像素顏色。
GIF 的缺點
GIF 的一個主要缺點是色彩限制——每幅圖像最多只能使用 256 種顏色。與 JPEG(可顯示多達 1600 萬種顏色)相比,這樣的色彩范圍顯然捉襟見肘。雖然這種限制在 GIF 誕生時是合理的(因為當時的硬件無法顯示太多顏色),但如今已經難以滿足顯示照片或漸變圖像的需求。
另一個缺點是 GIF 沒有 alpha 通道來實現真正的透明效果。像 PNG 這類格式支持 RGBA 模式(RGB 加上 A 通道),其中 A 表示每個像素的透明度。而 GIF 只能指定一個顏色為“透明色”,并使用這種方式模擬透明區域。這在精度和表現上都不如 alpha 通道。
總結
-
GIF 文件結構:開頭包括頭部、全局屏幕描述符和全局顏色表。之后是若干圖像塊(含壓縮圖像數據),最后是文件結束符。
-
圖像數據通過 LZW 算法 壓縮,該算法在編碼和解碼時動態構建字典,不需要額外傳輸字典數據。
-
優勢:適用于色彩數量較少的圖像(如徽標)、支持動畫和部分透明功能。
-
缺點:顏色數量限制為 256,且缺乏 alpha 通道支持,透明處理相對粗糙。