PNG、JPEG、BMP等幾種圖片格式詳解(四)—— GIF

版本記錄

版本號 時間
V1.0 2017.09.06

前言

只要是做圖片的或者與圖片相關的,那么圖片的格式就是一個不可以繞過的問題,我們見過很多的圖片格式,但是具體不同的圖片格式是如何定義的,又具有什么特點,很多時候我們都沒有深入研究過,下面我們就開始深入研究。感興趣的可以看我上面這篇。
1. PNG、JPEG、BMP等幾種圖片格式詳解(一)—— PNG
2. PNG、JPEG、BMP等幾種圖片格式詳解(二)—— JPEG
3. PNG、JPEG、BMP等幾種圖片格式詳解(三)—— BMP

GIF

以下部分內容來自百度百科,還會有一部分是自己的見解,我寫這篇文章的目的是既讓大家可以了解百度上已有的知識,但是不用再去找百度,還有就是可以看到我關于這種圖片格式的深層次的了解,看完這篇,包括我在內,會感覺到即使很小很小的一個知識點,深入以后都是非常深的,底層和深層次原理是我的最愛,這也是我寫博客的初衷和目的。

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文件的程序,則需向該公司支付版稅。由此,人們開始尋求一種新技術,以減少開發成本。PNGPortable Network Graphics,便攜網絡圖形)標準就在這個背景下應運而生了。它一方面滿足了市場對更少的法規限制的需要,另一方面也帶來了更少的技術上的限制,如顏色的數量等。

在2003年6月20日,LZW算法在美國的專利權已到期而失效。在歐洲、日本及加拿大的專利權亦已分別在2004年的6月18日、6月20日和7月7日到期失效。盡管如此,PNG文件格式憑著其技術上的優勢,已然躋身于網絡上第三廣泛應用格式。與GIF相關的專利于2006年8月11日過期。


GIF在iOS的尷尬處境

長久以來,iOS一直被吐槽不能用GIF。造成這一局面的主要原因是:

  • iOS關于照片的場景不會自動播放GIF,也沒有角標。
  • 一些應用將GIF視為靜態圖像去操作,導致用戶保持了一個GIF后,結果應用將其保存成JPG。
  • iOS只能通過imageI/O去操作GIF數據,UIKit對其絕緣。

分類

GIF分為靜態GIF和動畫GIF兩種,擴展名為.gif,是一種壓縮位圖格式,支持透明背景圖像,適用于多種操作系統,“體型”很小,網上很多小動畫都是GIF格式。其實GIF是將多幅圖像保存為一個圖像文件,從而形成動畫,最常見的就是通過一幀幀的動畫串聯起來的搞笑gif圖,所以歸根到底GIF仍然是圖片文件格式。
但GIF只能顯示256色。和jpg格式一樣,這是一種在網絡上非常流行的圖形文件格式。

GIF主要分為兩個版本,即GIF 89aGIF 87a

  • GIF 87a:是在1987年制定的版本
  • GIF 89a:是1989年制定的版本。在這個版本中,為GIF文檔擴充了圖形控制區塊、備注、說明、應用程序編程接口等四個區塊,并提供了對透明色和多幀動畫的支持。

格式

1. 語法

此給出的語法用來說明形成gif數據流的塊序列,用一些規則列表來表達。下面列出用于gif語法的符號定義。

  • <> 語法詞
  • ::= 符號定義
  • * 0個或更多的事件發生
  • + 1個或更多的事件發生
  • | 替代元素
  • [] 可選元素

gif語法的符號定義:<GIF數據流> ::= 頭部 <;邏輯視屏> <;數據>* 尾記錄

gif數據流中的數據塊可以分為三組:控制塊、成象塊和特殊用途塊。

  • 控制塊,如:頭部、邏輯視屏描述塊、圖像控制擴充和尾記錄,包含用于控制處理數據流或設置硬件參數的信息。
  • 成像塊,如:圖像描述符和純文本擴充,包含用于在顯示設備上成像的信息和數據。
  • 特殊用途塊,如:注釋擴充和應用擴充,包含那些既不用于處理數據流也不用于在顯示設備上成象的信息。

2. 解釋

色表- 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

文件存儲結構

GIF文件內部是按塊劃分的,包括控制塊( Control Block )數據塊(DataSub-blocks)兩種。控制塊是控制數據塊行為的,根據不同的控制塊包含一些不同的控制參數;數據塊只包含一些8-bit的字符流,由它前面的控制塊來決定它的功能,每個數據塊大小從0到255個字節,數據塊的第一個字節指出這個數據塊大?。ㄗ止潝担嬎銛祿K的大小時不包括這個字節,所以一個空的數據塊有一個字節,那就是數據塊的大小0x00。 下表是一個數據塊的結構:

一個GIF文件的結構可分為文件頭(File Header)、GIF數據流(GIF DataStream)和文件終結器(Trailer)三個部分。文件頭包含GIF文件署名(Signature)和版本號(Version);GIF數據流由控制標識符、圖象塊(ImageBlock)和其他的一些擴展塊組成;文件終結器只有一個值為0x3B的字符('';'')表示文件結束。下表顯示了一個GIF文件的組成結構:

  • 文件頭

是用來標識GIF署名(Signature)和版本號(Version)的。

GIF署名用來確認一個文件是否是GIF格式的文件,這一部分由三個字符組成:"GIF";文件版本號也是由三個字節組成,可以為"87a"或"89a"。具體如下圖所示。

文件頭組成
  • GIF數據流

它包含了很多的部分。

(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 ImageReadyfireworks 兩個。
WEB上gif在線制作編輯gif5.net,支持圖片、視頻、FLASH轉GIF。

我一般使用LICEcap制作gif圖。

參考文章

1. 百度百科
2. GIF圖片的文件儲存結構和動畫原理
3. GIF圖片原理和儲存結構深入解析

后記

未完,待續~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 前言 本文參考gif 格式圖片詳細解析。加入了一些自己的理解和解析方面的示例。 GIF格式解析 圖像互換格式(GI...
    oceanLong閱讀 16,665評論 4 26
  • 關于圖片的格式和隱寫術 圖片隱寫總結 需要掌握的處理技術 python PIL python struct 文件格...
    Arklight閱讀 2,343評論 0 0
  • 版本記錄 前言 只要是做圖片的或者與圖片相關的,那么圖片的格式就是一個不可以繞過的問題,我們見過很多的圖片格式,但...
    刀客傳奇閱讀 88,153評論 0 22
  • 最近花了點時間用 C++ 寫了一個 GIF 圖片的解析程序,在這一過程中我找了許多中文相關的材料,但沒有哪一篇是真...
    _番茄沙司閱讀 7,276評論 4 16
  • 參考文章:What's In A GIF 本文全面介紹了GIF文件格式的編碼格式。 GIF文件內容 GIF現在是一...
    小鳥君閱讀 10,213評論 1 5