版本記錄
| 版本號(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ā)成本。PNG(Portable 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 89a和GIF 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 ImageReady 和 fireworks 兩個(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ù)~~~
