GIF文件格式

GIF文件格式 

6.2 GIF文件格式
6.2.1 簡介

GIF(Graphics Interchange Format)是CompuServe公司開發的圖像文件存儲格式,1987年開發的GIF文件格式版本號是GIF87a,1989年進行了擴充,擴充後的版本號定義爲GIF89a。

GFI圖像文件以數據塊(block)爲單位來存儲圖像的相關信息。一個GIF文件由表示圖形/圖像的數據塊、數據子塊以及顯示圖形/圖像的控制信息塊組成,稱爲GIF數據流(Data Stream)。數據流中的所有控制信息塊和數據塊都必須在文件頭(Header)和文件結束塊(Trailer)之間。
GIF文件格式採用了LZW(Lempel-Ziv Walch)壓縮算法來存儲圖像數據,定義了允許用戶爲圖像設置背景的透明(transparency)屬性。此外,GIF文件格式可在一個文件中存放多幅彩色圖形/圖像。如果在GIF文件中存放有多幅圖,它們可以像演幻燈片那樣顯示或者像動畫那樣演示。

6.2.2. 文件結構

GIF文件結構的典型結構如圖6-01所示。爲下文說明方便,在構件左邊加了編號。
GIF文件格式(圖一)
圖6-01 GIF文件結構

數據塊可分成3類:控制塊(Control Block),圖形描繪塊(Graphic-Rendering Block)和專用塊(Special Purpose Block)。

(1) 控制塊:控制塊包含有用來控制數據流(Data Stream)或者設置硬件參數的信息,其成員包括:

GIF文件頭(Header) 
邏輯屏幕描述塊(Logical Screen Descriptor) 
圖形控制擴展塊(Graphic Control Extension) 
文件結束塊(Trailer)
(2) 圖形描繪塊:包含有用來描繪在顯示設備上顯示圖形的信息和數據,其成員包括:

圖像描述塊(Image Descriptor) 
無格式文本擴展塊(Plain Text Extension)
(3) 特殊用途數據塊;包含有與圖像處理無關的信息,其成員包括:

註釋擴展塊(Comment Extension) 
應用擴展塊(Application Extension)
除了在控制塊中的邏輯屏幕描述塊(Logical Screen Descriptor)和全局彩色表(Global Color Table)的作用範圍是整個數據流(Data Stream)之外, 所有其他控制塊僅控制跟在它們後面的圖形描繪塊。

6.2.3 構件詳解

1. GIF文件頭

文件頭描述塊(Header)定義GIF數據流(GIF Data Stream),它的結構如圖6-02所示。文件頭描述塊(Header)由GIF標記域(Signature)和版本號(Version)域組成,是一個由6個固定字節組成的數據塊,它們用來說明使用的文件格式是GIF格式及當前所用的版本號。GIF標記域(Signature)存放的是“GIF”,版本號域存放的是1987年5月發佈的“87a”或者1989年7月發佈的“89a”,或者更加新的版本號。

GIF文件格式(圖二)
圖6-02 標記/版本數據塊的結構

2. 邏輯屏幕描述塊

 邏輯屏幕描述塊(Logical Screen Descriptor)包含定義圖像顯示區域的參數,包括背景顏色信息。這個數據塊中的座標相對於虛擬屏幕的左上角,不一定是指顯示屏的絕對座標,這就意味可以參照窗口軟件環境下的窗口座標或者打印機座標來設計圖像顯示程序。邏輯屏幕描述塊的結構如圖6-03所示:

GIF文件格式(圖三)
圖6-03 屏幕描述塊的結構

邏輯描述塊包含7個字節。字節0和字節1用來說明邏輯顯示屏的寬度,字節3和字節4用來說明邏輯顯示屏的高度,字節4用來描述彩色表的屬性,字節5用來指定背景顏色索引,字節6用來計算像素的寬高比。現作如下說明:

(1) 屏幕描述塊中的第5個字節稱爲包裝域(Packed Fields),它的位結構如圖6-04所示,它由4個子域組成:

① 全局彩色表標誌(Global Color Table Flag )域G用來說明是否有全局彩色表存在。如果G=1,表示有一個全局彩色表(Global Color Table)將緊跟在這個邏輯屏幕描述塊(Logical Screen Descriptor)之後;這個標誌也用來選擇背景顏色索引(Background Color Index)。如果G=1,背景顏色索引(Background Color Index)域中的值就用作背景顏色的索引。

② 彩色分辨率(Color Resolution)域CR用來表示原始圖像可用的每種基色的位數(實際值減1)。這個位數表示整個調色板的大小,而不是這幅圖像使用的實際的顏色數。例如,如果該域的值CR=3,說明原始圖像可用每個基色有4位的調色板來生成彩色圖像。

③ 彩色表排序標誌(Sort Flag)域S用來表示全局彩色表(Global Color Table)中的顏色是否按重要性(或者稱使用率)排序。如果S=0,表示沒有重要性排序;如果S=1表示最重要的顏色排在前。這樣做的目的是輔助顏色數比較少的解碼器能夠選擇最好的顏色子集,在這種情況下解碼器就可選擇彩色表中開始段的彩色來顯示圖像。

④ 全局彩色表大小(Size of Global Color Table)域Size表示表示每個像素的位數,它用來計算全局彩色表(Global Color Table)中包含的字節數。在全局彩色表標誌(Global Color Table Flag)域G=0時就不需要計算,G=1時就要計算彩色表的大小,具體計算見下文的“3. 全局彩色表”。

GIF文件格式(圖四)
圖6-04 邏輯屏幕描述塊中的包裝域結構

(2) 屏幕描述塊中的第6個字節是背景顏色索引(Background Color Index),它是彩色表的一個索引值,用來指定背景顏色。如果全局彩色表標誌(Global Color Table Flag)域G=0,這個域的值也設置爲0。

(3) 像素寬高比(Pixel Aspect Ratio)域中的值是一個因數,是計算原始圖像像素的寬高比的一個近似值。如果該域的值範圍爲1~255,如果不等於0,寬高比的近似值按下式計算:

Aspect Ratio = (Pixel Aspect Ratio + 15) / 64
像素寬高比(Pixel Aspect Ratio)定義成像素的寬度與高度之比,比值的範圍在4:1~1:4之間,其增量爲1/64。

3. 全局彩色表

由於一個GIF文件可以包含多幅彩色圖像,每幅彩色圖像也許都包含適合自身特點的彩色表,所以一個GIF文件可以有好幾個彩色表。但歸納起來只有兩類:全局彩色表(Global Color Table)或局部彩色表(Local Color Table)。全局彩色表可用於圖像本身沒有帶彩色表的所有圖像和無格式文本擴展塊(Plain Text Extension),而局部彩色表只用於緊跟在它後面的一幅圖像。在處理全局彩色表和局部彩色表時需要注意下面一些規則。

① 如果GIF文件包含全局彩色表(Global Color Table),而且要顯示的圖像本身又帶有局部彩色表,那末顯示該幅彩色圖像時就用它自己的彩色表,而不用全局彩色表。在這種情況下,解碼器就首先保存全局彩色表(Global Color Table),然後使用局部彩色表(Local Color Table)來顯示圖像,最後再回復全局彩色表(Global Color Table)。

② 全局彩色表(Global Color Table)和局部彩色表(Local Color Table)都是可選擇的。由於這個原因,解碼器最好要保存全局彩色表(Global Color Table),一直到出現另一個全局彩色表(Global Color Table)爲止。這樣做之後,對於包含完全沒有彩色表的一幅或者多幅彩色圖像的GIF文件就可以使用最後保存的全局彩色表(Global Color Table)進行處理。

③ 如果同類型的圖像能夠使用相同的彩色表來顯示,編碼器就要儘可能使用一個全局彩色表(Global Color Table);如果沒有彩色表可用,解碼器就可以使用計算機系統提供的彩色表或者解碼器自身的彩色表。

④ 全局彩色表(Global Color Table)存在與否由邏輯屏幕描述塊(Logical Screen Descriptor)中字節5的全局彩色表標誌(Global Color Table Flag )域G的值確定。如果存在,彩色表就緊跟在邏輯屏幕描述塊(Logical Screen Descriptor)之後。彩色表的表項數目等於2(n +1),其中n=b2b1b0,每個表項由3個字節組成,分別代表R、G、B的相對強度,因此彩色表的字節數就等於3×2(n +1)。彩色表的結構如圖6-05所示。

GIF文件格式(圖五)
圖6-05 彩色表結構

局部彩色表與全局彩色表有相同的存儲格式。

4. 圖像描述塊

GIF圖像文件格式可包含數量不限的圖像,而且也沒有一個固定的存放順序,僅用一個字節的圖像分隔符(Image Separator)來判斷是不是圖像描述塊。每一幅圖像都由一個圖像描述塊(Image Descriptor)、可有可無的局部彩色表(Local Color Table)和圖像數據組成。每幅圖像必須要落在邏輯屏幕描述塊(Logical Screen Descriptor)中定義的邏輯屏(Logical Screen)尺寸範圍裏。

圖像描述塊(Image Descriptor)之前可以有一個或者多個控制塊,例如圖形控制擴展塊(Graphic Control Extension),其後可以跟着一個局部彩色表(Local Color Table)。無論前後是否有各種數據塊,圖像描述塊(Image Descriptor)總是帶有圖像數據。

圖像描述塊(Image Descriptor)的結構如圖6-06所示。

GIF文件格式(圖六)
圖6-06 圖像描述塊的結構

在圖6-06中,圖像分隔符(Image Separator)用來標識圖像描述塊的開始,該域包含固定的值:0x2C;圖像左邊位置(Image Left Position)是相對於邏輯屏幕(Logical Screen)最左邊的列號,邏輯屏幕最左邊的列好定義爲0;圖像頂部位置(Image Top Position) 是相對於邏輯屏幕(Logical Screen)頂部的行號,邏輯屏幕頂部的行號定義爲0。

GIF文件格式(圖七)
圖6-07 圖像描述塊中的包裝域結構

圖像描述塊(Image Descriptor)中的第9個字節稱爲包裝域(Packed Fields)字節,它的位結構如圖6-07所示,它由5個子域組成:

① 局部彩色表標誌(Local Color Table Flag )域L用來說明是否有局部彩色表存在。如果L=1,表示有一個局部彩色表(Local Color Table)將緊跟在這個圖像描述塊(Image Descriptor)之後;如果G=0,表示圖像描述塊(Image Descriptor)後面沒有局部彩色表(Local Color Table),該圖像要使用全局彩色表(Global Color Table)。

② 交插顯示標誌(Interlace Flag)域I用來表示該圖像是不是交插圖像(Interlaced Images)。如果I=0,表示該圖像不是交插圖像,如果I=1表示該圖像是交插圖像。使用該位標誌可知道圖像數據是如何存放的。GIF文件格式定義了兩種數據存儲方式:一種是按圖像行連續順序存儲,這個順序與顯示器上顯示行的順序相同;另一種按交插方式存儲。交插圖像按行分成如下所示的4組(Group):

Group 1:每隔8行組成一組,從第0行開始顯示 /第1遍交插

Group 2:每隔8行組成一組,從第4行開始顯示 /第2遍交插

Group 3:每隔4行組成一組,從第2行開始顯示 /第3遍交插

Group 4:每隔2行組成一組,從第1行開始顯示 /第4遍交插

由於顯示圖像需要較長的時間,使用這種方法存放和顯示圖像數據,人們就可以在圖像顯示完成之前看到這幅圖像的概貌,而不覺得顯示時間長。圖6-08說明了這種交插圖像的存儲和顯示順序。

GIF文件格式(圖八)
圖6-08 交插圖像顯示順序

③ 彩色表排序標誌(Sort Flag)域的含義與全局彩色表(Global Color Table)中(Sort Flag)域的含義相同。

④ 保留(Reserved)。

⑤ 局部彩色表大小(Size of Local Color Table)域的值用來計算局部彩色表(Global Color Table)中包含的字節數。

5. 局部彩色表

局部彩色表(Local Color Table)用於緊跟在它後面的圖像。彩色表是否存在取決於圖像描述塊(Image Descriptor)中局部彩色表標誌(Local Color Table Flag)位的設置。彩色表的結構和大小與全局彩色表(Global Color Table)完全相同。

6. 表基圖像數據

GIF圖像採用了LZW算法對實際的圖像數據進行壓縮。爲了提高壓縮編碼的效率,對LZW編碼器輸出的代碼採用可變長度碼VLC(variable-length-code),不是用位數高度的代碼來表示輸出,而且代表碼字的位數是可變的。

表基圖像數據(Table Based Image Data)由LZW最小代碼長度(LZW Minimum Code Size)和圖像數據(Image Data)組成,如圖6-09所示。LZW最小代碼長度域的值用來確定圖像數據中LZW代碼使用的初始位數。圖像數據(Image Data)由數據子塊(Data Sub-blocks)序列組成。

GIF文件格式(圖九)
圖6-09 圖像數據的存儲格式

數據子塊(Data Sub-blocks)的結構如圖6-10所示,這是一個可變長度的數據塊,其長度由塊大小域(Block Size)域中的值確定,字節數在0~255之間。

GIF文件格式(圖十)
圖6-10 數據子塊的結構

7. 圖形控制擴展塊

圖形控制擴展塊(Graphic Control Extension)包含處理圖形描繪塊時要使用的參數,它的結構如圖6-11所示。現說明如下:

(1) 擴展導入符Extension Introducer)用於識別擴展塊的開始,域中的值是一個數值等於0x21的固定值。

(2) 圖形控制標籤(Graphic Control Label)用於標識當前塊是一個圖形控制擴展塊,域中的值是一個數值等於0xF9的固定值。

(3) 塊大小(Block Size)用來說明該擴展塊所包含字節數,該字節數是從這個塊大小(Block Size)域之後到塊結束符之間的字節數。

GIF文件格式(圖十)
圖6-11 圖像描述塊的結構

(4) 包裝域的結構如圖6-12所示。處理方法(Disposal Method)規定圖形顯示之後譯碼器要用表6-03中所述方法進行處理。

GIF文件格式(圖十二)
表6-03 包裝域規定的處理方法

用戶輸入標誌(User Input Flag)域表示在繼續處理之前是否需要用戶輸入響應。在延時時間(Delay Time)和用戶輸入標誌(User Input Flag)都設置爲1的情況下,繼續處理的開始時間取決於用戶響應輸入在前還是延時時間結束在前。

GIF文件格式(圖十三)
圖6-12 圖形控制擴展塊的包裝結構

(5) 透明(Transparency Flag)表示是否給出透明索引(transparency index)

(6) 延時時間(Delay Time)用來指定在圖形顯示之後繼續處理數據流之前的等待時間,一百分之一秒爲單位。

(7) 當且僅當透明標誌位設置爲1時,透明索引(Transparency Index)用來指示處理程序是否要修改顯示設備上的相應象點。當且僅當透明標誌位設置爲1時,就要修改。

(8) 塊結束符(Block Terminator)表示該圖形控制擴展塊(Graphic Control Extension)結束,它是由一個字節組成的數據塊,該域的值是一個固定的值:0x00,因此稱爲零長度數據子塊(zero-length Data Sub-block)。

8. 無格式文本擴展塊

無格式文本擴展塊(Plain Text Extension)包含文本數據和描繪文本所須的參數。文本數據用7位的ASCII字符編碼並以圖形形式顯示。擴展塊的結構如圖6-13所示。

GIF文件格式(圖十四)
圖6-13 無格式文本擴展塊結構

9. 註釋擴展塊

註釋擴展塊(Comment Extension)域的內容用來說明圖形、作者或者其他任何非圖形數據和控制信息的文本信息。

註釋擴展塊的結構如圖6-14所示。其中的註釋數據是序列數據子塊(Data Sub-blocks),每塊最多255個字節,最少1個字節。

GIF文件格式(圖十五)
圖6-14 註釋擴展塊

10. 應用擴展塊

應用擴展塊(Application Extension)包含製作該圖像文件的應用程序的相關信息,它的結構如圖6-15所示。

GIF文件格式(圖十六)
圖6-15 應用擴展塊

11. GIF文件結束塊

結束塊(GIF Trailer)表示GIF文件的結尾,它包含一個固定的數值:0x3B。它具有如圖6-16所示的結構。

GIF文件格式(圖十七)
圖6-16 GIF文件結束塊

6.2.4 速差表
表6-04 GIF文件格式
GIF文件格式(圖十八)
表6-04 GIF文件格式

發佈了37 篇原創文章 · 獲贊 5 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章