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文件中存放有多幅圖,它們能夠像演幻燈片那樣顯示或者像動畫那樣演示。spa

6.2.2. 文件結構設計

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

 

1排序

Header索引

 

GIF文件頭ip

 

2ci

Logical Screen Descriptor

 

邏輯屏幕描述塊

 

3

Global Color Table

 

全局彩色表

 
 

… 擴展模塊(任選) …

     

4

Image Descriptor

 

圖形描述塊

 

5

Local Color Table

 

局部彩色表(可重複n次)

6

Table Based Image Data

 

表式壓縮圖像數據

7

Graphic Control Extension

 

圖像控制擴展塊

8

Plain Text Extension

 

無格式文本擴展塊

n

9

Comment Extension

 

註釋擴展塊

10

Applicaton Extension

 

應用程序擴展塊

 
 

… 擴展模塊(任選) …

     

11

GIF Trailer

 

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」,或者更加新的版本號。

 

7

6

5

4

3

2

1

0

字節號

域的名稱

數據類型

 

0

   

Signature

1

GIF標記

3 Bytes

 

2

   
 

3

   

Version

4

版本號

3 Bytes

 

5

   

 

 

圖6-02 標記/版本數據塊的結構

 

2. 邏輯屏幕描述塊

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

 

7

6

5

4

3

2

1

0

字節號

域的名稱

類型

Logical Screen Width

0

邏輯屏幕寬度

Unsigned

 

1

(以像素爲定單位)

 

Logical Screen Height

2

邏輯屏幕高度

Unsigned

 

3

(以像素爲定單位)

 

G

CR

S

Size

4

包裝域

見圖6-04

Background Color Index

5

背景顏色索引

Byte

Pixel Aspect Ratio

6

像素寬高比

Byte

 

圖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. 全局彩色表」

7

6

5

4

3

2

1

0

Global Color Table Flag

Color Resolution

Sort Flag

Size of Global Color Table

 

圖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所示。

 

7 6 5 4 3 2 1 0

字節號

域的名稱

數據類型

red intensity

0

紅色索引 000

Byte

green intensity

1

綠色索引 000

Byte

blue intensity

2

藍色索引 000

Byte

red intensity

3

紅色索引 001

Byte

green intensity

4

綠色索引 001

Byte

blue intensity

5

藍色索引 001

Byte

 

 

red intensity

745

紅色索引 255

Byte

green intensity

746

綠色索引 255

Byte

blue intensity

767

藍色索引 255

Byte

 

圖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所示。

 

7

6

5

4

3

2

1

0

字節號

域的名稱

類型

Image Separator

0

圖像分隔符

Byte

Image Left Position

1

圖像左邊位置

Unsigned

 

2

(以像素爲定單位)

 

Image Top Position

3

圖像頂部位置

Unsigned

 

4

(以像素爲定單位)

 

Image Width

5

圖像寬度

Unsigned

 

6

(以像素爲定單位)

 

Image Height

7

圖像高度

Unsigned

 

8

(以像素爲定單位)

 
 

9

包裝域

見圖6-07

 

圖6-06 圖像描述塊的結構

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

7

6

5

4

3

2

1

0

Local Color Table Flag

Interlace Flag

Sort Flag

Reserved

Size of Local Color Table

圖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說明了這種交插圖像的存儲和顯示順序。

 

行號

像 點

交插遍次

0

……………………………………

1

     

1

……………………………………

     

4

2

……………………………………

   

3

 

3

……………………………………

     

4

4

……………………………………

 

2

   

5

……………………………………

     

4

6

……………………………………

   

3

 

7

……………………………………

     

4

8

……………………………………

1

     

9

……………………………………

     

4

10

……………………………………

   

3

 

11

……………………………………

     

4

12

……………………………………

 

2

   

13

……………………………………

     

4

14

……………………………………

   

3

 

15

……………………………………

     

4

16

……………………………………

1

     

17

……………………………………

     

4

18

……………………………………

   

3

 

19

……………………………………

     

4

 

圖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)序列組成。

 

7

6

5

4

3

2

1

0

 

域的名稱

類型

LZW Minimum Code Size

 

LZW最小代碼長度

 

Byte

 

 

Image Data

 

 

圖像數據

Data 
Sub-blocks

 

 

圖6-09 圖像數據的存儲格式

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

 

7 6 5 4 3 2 1 0

字節號

域的名稱

數據類型

Block Size

0

塊大小

Byte

 

1

 

Byte

     

Byte

Data Values

 

數值

Byte

     

Byte

 

 

 

 

     

Byte

 

 

Byte

 

 

Byte

 

255

 

Byte

 

 

圖6-10 數據子塊的結構

 

7. 圖形控制擴展塊

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

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

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

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

 

7

6

5

4

3

2

1

0

字節號

域的名稱

類型

Extension Introducer

0

擴展導入符

Byte

Graphic Control Label

1

圖形擴展標籤

Byte

       

Block Size

0

塊大小

Byte

<Packed Fields>

1

包裝域

See below

Delay Time

2

延時時間

Unsigned

       

Transparent Color Index

3

透明彩色索引

Byte

       

Block Terminator

0

塊結束符

Byte

 

圖6-11 圖像描述塊的結構

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

表6-03 包裝域規定的處理方法

 

域值

處理方法

0

沒有指定要作任何處理

1

不處理,圖形留在原處

2

顯示圖形的區域必需要恢復成背景顏色

3

恢復成之前顯示的圖形

4~7

(未定義)

 

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

7

6

5

4

3

2

1

0

Reserved(保留)

Disposal Method(處理方法)

User Input Flag

Transparent Color Flag

圖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所示。

 

7 6 5 4 3 2 1 0

字節號

域的名稱

數據類型

Extension Introducer (0x21)

0

擴展導入符

Byte

Plain Text Label (0x01)

1

無格式文本標籤

Byte

 

 

Block Size

0

塊大小

Byte

Text Grid Left Position

1

文本網格左列位置

Unsigned

 

2

   

Text Grid Top Position

3

文本網格頂行位置

Unsigned

 

4

   

Text Grid Width

5

文本網格寬度

Unsigned

 

6

   

Text Grid Height

7

文本網格高度

Unsigned

 

8

   

Character Cell Width

9

字符單元寬度

Byte

Character Cell Height

10

字符單元高度

Byte

Text Foreground Color Index

11

文本顏色索引

Byte

Text Background Color Index

12

文本背景顏色索引

Byte

 

 

       

Plain Text Data

 

無格式文本數據

Data Sub-blocks

       

 

圖6-13 無格式文本擴展塊結構

 

9. 註釋擴展塊

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

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

 

7 6 5 4 3 2 1 0

字節號

域的名稱

數據類型

Extension Introducer (0x21)

0

擴展導入符

Byte

Comment Label (0xFE)

1

註釋標籤

Byte

 

 

Comment Data

0

註釋數據

 
     

Data Sub-blocks

 

   
 

N-1

   

 

 

Block Terminator

 

塊結束符

Byte

 

圖6-14 註釋擴展塊

 

10. 應用擴展塊

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

 

7 6 5 4 3 2 1 0

字節號

域的名稱

數據類型

Extension Introducer (0x21)

0

擴展導入符

Byte

Extension Label (0xFF)

1

擴展標籤

Byte

 

 

Block Size

0

塊大小

Byte

 

1

   
 

2

   
 

3

   

Application Identifier

4

應用程序標識符

8 Bytes

 

5

(程序名稱)

 
 

6

   
 

7

   
 

8

   
 

9

   

Appl. Authentication Code

10

應用程序識別碼

3 Bytes

 

11

   

 

 

       

Application Data

 

應用數據

Data Sub-blocks

       

 

 

Block Terminator

0

 

Byte

 

圖6-15 應用擴展塊

 

11. GIF文件結束塊

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

 

7 6 5 4 3 2 1 0

域的名稱

數據類型

GIF Trailer = 0x3B

GFI文件結束塊

Byte

 

圖6-16 GIF文件結束塊

6.2.4 速差表

表6-04 GIF文件格式

 

塊的名稱

須要

標籤

擴展

版本號.

Application Extension(應用擴展)

Opt. (*)

0xFF (255)

yes

89a

Comment Extension(註釋擴展)

Opt. (*)

0xFE (254)

yes

89a

Global Color Table(全局彩色表)

Opt. (1)

none

no

87a

Graphic Control Extension(圖形控制擴展)

Opt. (*)

0xF9 (249)

yes

89a

Header(文件頭)

Req. (1)

none

no

N/A

Image Descriptor(圖像描述)

Opt. (*)

0x2C (044)

no

87a (89a)

Local Color Table(局部彩色表)

Opt. (*)

none

no

87a

Logical Screen Descriptor(邏輯屏幕描述塊)

Req. (1)

none

no

87a (89a)

Plain Text Extension(無格式文本擴展)

Opt. (*)

0x01 (001)

yes

89a

Trailer(文件結束)

Req. (1)

0x3B (059)

no

87a

 

Unlabeled Blocks(無標號塊)

 

Header(文件頭)

Req. (1)

none

no

N/A

Logical Screen Descriptor(邏輯屏幕描述塊)

Req. (1)

none

no

87a (89a)

Global Color Table(全局彩色表)

Opt. (1)

none

no

87a

Local Color Table(局部彩色表)

Opt. (*)

none

no

87a

 

Graphic-Rendering Blocks(圖像描繪塊)

 

Plain Text Extension(無格式文本擴展)

Opt. (*)

0x01 (001)

yes

89a

Image Descriptor(圖像描述塊)

Opt. (*)

0x2C (044)

no

87a (89a)

 

Control Blocks(控制塊)

 

Graphic Control Extension(圖形控制擴展)

Opt. (*)

0xF9 (249)

yes

89a

 

Special Purpose Blocks(專用塊)

 

Trailer(結束)

Req. (1)

0x3B (059)

no

87a

Comment Extension(註釋擴展)

Opt. (*)

0xFE (254)

yes

89a

Application Extension(應用程序擴展)

Opt. (*)

0xFF (255)

yes

89a

 

表中:Req. (1) 表示最多出現一次

Opt. (*) 出現次數大於等於0

相關文章
相關標籤/搜索