版本記錄
版本號 | 時間 |
---|---|
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文件的程序,則需向該公司支付版稅。由此,人們開始尋求一種新技術,以減少開發成本。PNG(Portable 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 89a
和GIF 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 ImageReady 和 fireworks 兩個。
WEB上gif在線制作編輯gif5.net
,支持圖片、視頻、FLASH轉GIF。
我一般使用LICEcap
制作gif圖。
參考文章
1. 百度百科
2. GIF圖片的文件儲存結構和動畫原理
3. GIF圖片原理和儲存結構深入解析
后記
未完,待續~~~