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

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.09.06

前言

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

GIF

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

GIF(Graphics Interchange Format)的原義是“圖像互換格式”,是CompuServe公司在 1987年開發(fā)的圖像文件格式。GIF文件的數(shù)據(jù),是一種基于LZW算法的連續(xù)色調(diào)的無損壓縮格式。其壓縮率一般在50%左右,它不屬于任何應(yīng)用程序。GIF格式可以存多幅彩色圖像,如果把存于一個(gè)文件中的多幅圖像數(shù)據(jù)逐幅讀出并顯示到屏幕上,就可構(gòu)成一種最簡單的動(dòng)畫。

GIF圖象是基于顏色列表的(存儲(chǔ)的數(shù)據(jù)是該點(diǎn)的顏色對(duì)應(yīng)于顏色列表的索引值),最多只支持8位(256色)。GIF文件內(nèi)部分成許多存儲(chǔ)塊,用來存儲(chǔ)多幅圖象或者是決定圖象表現(xiàn)行為的控制塊,用以實(shí)現(xiàn)動(dòng)畫和交互式應(yīng)用。GIF文件還通過LZW壓縮算法壓縮圖象數(shù)據(jù)來減少圖象尺寸。

GIF格式自1987年由CompuServe公司引入后,因其體積小、成像相對(duì)清晰,特別適合于初期慢速的互聯(lián)網(wǎng),而大受歡迎。

在早期,GIF所用的LZW壓縮算法是Compuserv所開發(fā)的一種免費(fèi)算法。然而令很多軟件開發(fā)商感到意外的是,GIF文件所采用的壓縮算法忽然成了Unisys公司的專利。

據(jù)Unisys公司稱,他們已注冊了LZW算法中的W部分。如果要開發(fā)生成(或顯示)GIF文件的程序,則需向該公司支付版稅。由此,人們開始尋求一種新技術(shù),以減少開發(fā)成本。PNGPortable Network Graphics,便攜網(wǎng)絡(luò)圖形)標(biāo)準(zhǔn)就在這個(gè)背景下應(yīng)運(yùn)而生了。它一方面滿足了市場對(duì)更少的法規(guī)限制的需要,另一方面也帶來了更少的技術(shù)上的限制,如顏色的數(shù)量等。

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


GIF在iOS的尷尬處境

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

  • iOS關(guān)于照片的場景不會(huì)自動(dòng)播放GIF,也沒有角標(biāo)。
  • 一些應(yīng)用將GIF視為靜態(tài)圖像去操作,導(dǎo)致用戶保持了一個(gè)GIF后,結(jié)果應(yīng)用將其保存成JPG。
  • iOS只能通過imageI/O去操作GIF數(shù)據(jù),UIKit對(duì)其絕緣。

分類

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

GIF主要分為兩個(gè)版本,即GIF 89aGIF 87a

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

格式

1. 語法

此給出的語法用來說明形成gif數(shù)據(jù)流的塊序列,用一些規(guī)則列表來表達(dá)。下面列出用于gif語法的符號(hào)定義。

  • <> 語法詞
  • ::= 符號(hào)定義
  • * 0個(gè)或更多的事件發(fā)生
  • + 1個(gè)或更多的事件發(fā)生
  • | 替代元素
  • [] 可選元素

gif語法的符號(hào)定義:<GIF數(shù)據(jù)流> ::= 頭部 <;邏輯視屏> <;數(shù)據(jù)>* 尾記錄

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

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

2. 解釋

色表- gif格式利用色表來顯示基于光柵的圖像。色表分為全局色表和局部色表。全局色表對(duì)于那些沒有設(shè)置局部色表的圖像起作用。全局色表的作用域是整個(gè)數(shù)據(jù)流。局部色表對(duì)于緊接在其后的單張圖像起作用。這兩種色表都是可選的。

全局色表這東西是我們感興趣的東西,它有點(diǎn)像png格式定義種的調(diào)色板,如果要修改gif圖片的顏色,哈哈,修改這個(gè)全局色表就可以,如果有全局色表塊,那么它一定從gif流的14個(gè)字節(jié)開始(頭部6個(gè) + 邏輯視頻描述塊7個(gè))。

以下是各數(shù)據(jù)塊的說明,如果注明為版本89a的話,則說明這個(gè)數(shù)據(jù)塊不會(huì)在87a版的協(xié)議中出現(xiàn)。

  • 頭部(6個(gè)字節(jié))
  • 標(biāo)識(shí)符(3字節(jié)) ---GIF
  • 版本(3字節(jié)) ---87a (or 89a)
  • 邏輯視屏描述塊
  • 邏輯屏幕寬(2字節(jié))
  • 邏輯屏幕高(2字節(jié))
  • Packed Fields (1字節(jié))
  • 背景色索引(1字節(jié))
  • 象素高寬比(1字節(jié))

Packed Fields說明:

  • 全局色表標(biāo)志 1 Bit
  • 顏色方案 3 Bits
  • 短標(biāo)志 1 Bit
  • 全局色表尺寸 3 Bits

文件存儲(chǔ)結(jié)構(gòu)

GIF文件內(nèi)部是按塊劃分的,包括控制塊( Control Block )數(shù)據(jù)塊(DataSub-blocks)兩種??刂茐K是控制數(shù)據(jù)塊行為的,根據(jù)不同的控制塊包含一些不同的控制參數(shù);數(shù)據(jù)塊只包含一些8-bit的字符流,由它前面的控制塊來決定它的功能,每個(gè)數(shù)據(jù)塊大小從0到255個(gè)字節(jié),數(shù)據(jù)塊的第一個(gè)字節(jié)指出這個(gè)數(shù)據(jù)塊大?。ㄗ止?jié)數(shù)),計(jì)算數(shù)據(jù)塊的大小時(shí)不包括這個(gè)字節(jié),所以一個(gè)空的數(shù)據(jù)塊有一個(gè)字節(jié),那就是數(shù)據(jù)塊的大小0x00。 下表是一個(gè)數(shù)據(jù)塊的結(jié)構(gòu):

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

  • 文件頭

是用來標(biāo)識(shí)GIF署名(Signature)和版本號(hào)(Version)的。

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

文件頭組成
  • GIF數(shù)據(jù)流

它包含了很多的部分。

(1) 邏輯屏幕標(biāo)識(shí)符(Logical Screen Descriptor):這一部分由7個(gè)字節(jié)組成,定義了GIF圖象的大小(Logical Screen Width &Height)、顏色深度(Color Bits)、背景色(Blackground ColorIndex)以及有無全局顏色列表(Global Color Table)和顏色列表的索引數(shù)(IndexCount),具體描述見下圖。

也可以參考下圖。

(2)全局顏色列表(Global Color Table)

全局顏色列表必須緊跟在邏輯屏幕標(biāo)識(shí)符后面,每個(gè)顏色列表索引條目由三個(gè)字節(jié)組成,按R、G、B的順序排列。

(3)圖象標(biāo)識(shí)符(Image Descriptor):一個(gè)GIF文件內(nèi)可以包含多幅圖象,一幅圖象結(jié)束之后緊接著下是一幅圖象的標(biāo)識(shí)符,圖象標(biāo)識(shí)符以0x2C('','')字符開始,定義緊接著它的圖象的性質(zhì),包括圖象相對(duì)于邏輯屏幕邊界的偏移量、圖象大小以及有無局部顏色列表和顏色列表大小,由10個(gè)字節(jié)組成,具體如下所示。

也可以參考下圖。

(4)局部顏色列表(Local Color Table):如果上面的局部顏色列表標(biāo)志置位的話,則需要在這里(緊跟在圖象標(biāo)識(shí)符之后)定義一個(gè)局部顏色列表以供緊接著它的圖象使用,注意使用前應(yīng)線保存原來的顏色列表,使用結(jié)束之后回復(fù)原來保存的全局顏色列表。如果一個(gè)GIF文件即沒有提供全局顏色列表,也沒有提供局部顏色列表,可以自己創(chuàng)建一個(gè)顏色列表,或使用系統(tǒng)的顏色列表。局部顏色列表的排列方式和全局顏色列表一樣:RGBRGB......

(5) 基于顏色列表的圖象數(shù)據(jù)(Table-Based Image Data):由兩部分組成:LZW編碼長度(LZW Minimum Code Size)和圖象數(shù)據(jù)(Image Data)

下面給出總體的存儲(chǔ)結(jié)構(gòu)的原理圖。

制作

PC上制作軟件主要為Adobe ImageReadyfireworks 兩個(gè)。
WEB上gif在線制作編輯gif5.net,支持圖片、視頻、FLASH轉(zhuǎn)GIF。

我一般使用LICEcap制作gif圖。

參考文章

1. 百度百科
2. GIF圖片的文件儲(chǔ)存結(jié)構(gòu)和動(dòng)畫原理
3. GIF圖片原理和儲(chǔ)存結(jié)構(gòu)深入解析

后記

未完,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容