官术网_书友最值得收藏!

2.5 圖像文件格式

圖像文件格式是記錄和存儲影像信息的格式。對數字圖像進行存儲、傳輸、處理,必須采用一定的圖像格式,也就是把圖像的像素按照一定的方式進行組織和存儲,將圖像數據存儲為文件就成為圖像文件。圖像文件格式決定了圖像文件的數據結構信息,以及文件如何與其他文件交換數據等。常見的圖像格式文件包括BMP、JPEG、PNG、TIFF、GIF、RAW等。由于數字設備獲取的圖像文件一般都很大,而儲存容量卻有限,因此圖像通常都會經過壓縮再儲存。

2.5.1 BMP文件

BMP是英文Bitmap(位圖)的簡寫,即位圖文件,是一種與硬件設備無關(device-independent Bitmap)的圖像文件格式。BMP文件是Windows系統中的標準圖像文件格式,被很多Windows應用程序支持。隨著Windows系統的流行及應用程序的不斷豐富,BMP位圖格式得到了越來越廣泛的應用。BMP文件采用位映射存儲格式,其特點是包含的圖像信息較豐富,除位圖深度可選之外,不進行任何其他壓縮,但由此也導致了它與生俱來的缺點是占用磁盤空間過大。BMP圖像文件的深度可以選擇1bit、4bit、8bit、24bit。采用該格式存儲圖像時,BMP圖像的掃描按照從左到右、從下到上的順序進行。

BMP圖像文件格式一般由文件頭信息塊、圖像描述信息塊、顏色表(真彩圖像無顏色表)和圖像數據區四個部分組成,并以BMP為擴展名。由于BMP文件格式是Windows環境中交換與圖有關的數據的一種標準,因此在Windows環境中運行的圖形圖像軟件都支持BMP圖像格式。

1. BMP文件的組成

BMP文件由位圖文件頭、位圖信息頭、顏色信息(調色板數據)和位圖數據共四個部分組成,如表2-2所示。

表2-2 BMP文件結構

2. BMP文件頭

BMP文件頭數據含有BMP文件的類型、文件大小和位圖起始位置(相對于位圖文件頭的偏移量)等信息。FILEHEADER結構占14字節,其定義如下:

3. 位圖信息頭

BMP位圖信息頭數據用于說明位圖的尺寸等信息,主要包括位圖大小、像素深度、位圖是否壓縮等信息。位圖信息頭共占40字節,其定義如下:

對于BMP格式的圖像文件,無論文件尺寸的大或小,都不會對數據進行任何壓縮處理。如果位圖文件采用壓縮格式,則16色位圖采用RLE-4壓縮算法,256色位圖采用RLE-8算法。

4. 顏色表

顏色信息包含本圖像用到的顏色表,顯示圖像時需要用該顏色表來生成調色板。如果圖像為RGB真彩色圖像,圖像的每一像素用24bit表示,這時圖像文件中沒有顏色表信息塊。顏色表用于說明位圖中的顏色,它有若干個表項,每一個表均是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:

顏色表RGBQUAD結構數據的個數由biBitCount來確定。當biBitCount=1,4,8時,分別有2,16,256個顏色表項;當biBitCount=24時,為真彩色圖像,每個字節分別對應R、G、B值,此時圖像無顏色表項。在BMP文件的顏色信息表RGBQUARD結構中增加了一個保留字段rgbReserved,它不代表任何顏色信息,但必須取固定值0。

根據上述RGBQUARD結構對顏色信息的定義,紅、綠、藍排列順序與一般真彩色圖像文件的顏色排列順序正好相反。即一個位圖中某一像素點的顏色為“FF、00、00、00”,則表示該點為藍色,而不是紅色。

位圖信息頭和顏色表組成位圖信息BITMAPINFO數據結構,BITMAPINFO結構定義如下:

5. 位圖數據

BMP文件中的位圖數據表示圖像對應的像素值。位圖數據記錄了位圖的每一個像素值,圖像像素值的記錄順序在掃描行內是從左到右,在掃描行之間是從下到上。即BMP文件首先存放的是圖像的最后一行像素,最后存儲圖像的第一行像素值,對于同一行之間的像素值,則按照先左邊后右邊的順序存儲。

位圖的一個像素值所占的字節數:

當biBitCount=1時,8個像素占1字節;

當biBitCount=4時,2個像素占1字節;

當biBitCount=8時,1個像素占1字節;

當biBitCount=24時,1個像素占3字節,按順序分別為B、G、R值。

Windows規定一個掃描行所占的字節數必須是4的倍數(即以long為單位),不足則以0填充,位圖每一掃描行的字節數:

DataSizePerline=(bi.biWidth×bi.biBitCount+31)/8

位圖數據的大小:DataSizePerline×biHeight

若BMP文件起始部分數據如下:

424D 46900000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100?1000 0300 0000 0090 0000 A00F 0000 A00F0000 0000 00000000 0000?00F8 E007 1F00 0000?02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2…

其中,1~14字節為圖像文件頭,數據所表示的含義分別如下。

(1)1、2:(這里的數字代表的是字節,下同)圖像文件頭。0x4d42='BM',即BMP格式。

(2)3~6:整個文件大小。4690 0000,即00009046h=36934。

(3)7、8:保留,必須設置為0。

(4)9、10:保留,必須設置為0。

(5)11~14:從文件開始到位圖數據之間的偏移量(14+40+4?2^biBitCount))(在有顏色板的情況下)。4600 0000,為00000046h=70,上面的文件頭就是35字=70字節。

15~54為位圖信息頭數據,數據含義如下。

(6)15~18:位圖信息頭長度。

(7)19~22:位圖寬度,以像素為單位。8000 0000,為00000080h=128。

(8)23~26:位圖高度,以像素為單位。9000 0000,為00000090h=144。

(9)27、28:位圖的位面數,該值總是1。0100,為0001h=1。

(10)29、30:每一像素的位數。1(單色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增強型真彩色)。1000為0010h=16。

(11)31~34:壓縮信息說明,即0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)。

(12)35~38:用字節數表示的位圖數據的大小,該數必須是4的倍數,數值上等于一行所占的字節數×位圖高度。0090 0000為00009000h=80×90×2h=36864。假設位圖是24位,寬為41,高為30,則該數值=(biWidth?biBitCount+31)/32?4?biHeight,即=(41?24+31)/32?4?30=3720。

(13)39~42:水平分辨率,像素/米。A00F 0000為0000 0FA0h=4000。

(14)43~46:垂直分辨率,像素/米。A00F 0000為0000 0FA0h=4000。

(15)47~50:位圖使用的顏色索引數。設為0,則說明使用所有調色板項。

(16)51~54:對圖像顯示有重要影響的顏色索引的數目。若為0,則表示所有顏色都重要。

2.5.2 JPEG文件

JPEG格式是一種常用的圖像文件格式,其文件后綴名為.jpeg或.jpg,它是Joint Photographic Experts Group(聯合圖像專家組)的英文縮寫。JPEG格式是一個比較成熟的圖像有損壓縮格式,能將圖像數據壓縮到很小的存儲空間并保持較好的圖像質量。也就是說,雖然圖像存儲為JPEG格式會有一些信息損失,但人眼很難分辨出壓縮前后圖像質量的差別。JPEG圖像存儲格式既滿足了視覺系統對色彩和分辨率的要求,又在圖像的清晰度和文件大小的選擇上找到了一個很好的平衡點。

JPEG格式是一種靈活的圖像文件格式,具有調節圖像質量的功能,它允許采用不同的壓縮比對圖像進行壓縮。根據對圖像質量的要求,JPEG格式的壓縮比通常為10:1~40:1。壓縮比越小,圖像質量越高;反之,壓縮比越高,圖像質量越差。JPEG文件被壓縮的數據主要是高頻信息,能較好地保護低頻信息,同時也能較好地保護彩色信息,適應于連續色調的圖像保存。

隨著多媒體技術的應用越來越廣泛,傳統的JPEG壓縮算法的缺點和不足越來越明顯地表現出來。例如,若被壓縮的圖像中具有大片近似的色彩信息時,用JPEG壓縮算法就容易產生馬賽克效應,因此,當對圖像的質量要求較高時,傳統的JPEG壓縮算法可能達不到要求。為了滿足新的應用需求,專家組對JPEG格式進行了改進,推出了JPEG 2000標準,新的壓縮算法最大的特點是將傳統JPEG壓縮算法中的首選DCT算法改為了首選小波變換壓縮算法。JPEG 2000具有以下4個特點:

(1)壓縮比高。與傳統的JPEG壓縮算法相比,JPEG 2000的壓縮比提高了20%~30%。

(2)同時支持有損壓縮和無損壓縮,誤差穩定性好,圖像的質量更好。

(3)漸進傳輸。網絡下載圖像時,JPEG 2000按塊傳輸,有助于快速瀏覽網絡信息,提高了網絡下載的速度。

(4)支持感興趣的ROI,能制定ROI,可單獨對ROI進行壓縮和解壓操作。

JPEG圖像文件結構定義了一些列標記用于區分和識別圖像數據及其相關信息,每一個標記由2字節組成,并規定前一個字節是0xFF,每個標記前還可添加若干0xFF字節,且數量不限。JPEG格式的8個重要標記如下。

(1)SOI 0xD8:圖像開始。

(2)APP0 0xE0:APP0段主要存儲圖片的識別信息(字符串“JFIF\0”),包括APP0的長度、標識符、版本號、XY的密度單位(units為0表示無單位;units為1表示密度單位為“點數/英寸”;units為2表示密度單位為“點數/cm”;),X方向像素密度,Y方向像素密度,縮略圖水平像素數目,縮略圖垂直像素數目及縮略圖RGB位圖信息等。

(3)APPn 0xE1~0xEF:其他應用數據塊,包括APPn的長度等信息。

(4)DQT 0XDB:包括量化表、量化表長度和量化表數目等。顏色可分為RGB三個分量,但在JPEG文件的RGB色彩格式需要先轉化為YUV的格式。Y分量代表亮度信息,U、V分量代表色差信息。通常人眼對于Y分量更為敏感,量化表正是基于這一原理進行信息壓縮的。

(5)SOF0 0xC0:圖像大小、每個像素的位數及YUV每個分量的采樣信息等。即圖像數據幀的開始,包括幀開始長度與精度、每個顏色分量、像素位數、圖像高度與寬度、顏色分量數、每個顏色分量的ID、垂直方向的樣本因子、水平方向的樣本因子、量化表號等。

(6)DHT 0xC4:定義Huffman表,包括表的長度、類型、直流或交流量表、索引、位表和值表。

(7)SOS 0xDA:掃描線開始。包括掃描開始長度、顏色分量數、直流系數表號、交流系數表號、縮略圖數據等。

(8)EOI 0xD9:圖像全部數據結束。

JPEG文件格式更深入的了解可參考第9章中關于JPEG標準的相關介紹。

2.5.3 PNG文件

PNG圖像文件存儲格式即可移植網絡圖形格式(portable network graphic format, PNG),是一種位圖文件(bitmap file)存儲格式。PNG用于存儲灰度圖像時,灰度圖像的深度可達16位;存儲彩色圖像時,彩色圖像的深度可達48位,并且還可存儲多到16位的α通道數據。PNG采用從LZ77派生的Zlib無損數據壓縮算法,壓縮比高,生成文件容量小,一般應用于Java程序或網頁。

1. PNG文件的特點

PNG文件具有以下特點:

(1)體積小。網絡通信中因帶寬制約,在保證圖片清晰、逼真的前提下,網頁上不可能大范圍地使用文件較大的bmp格式文件。

(2)無損壓縮。PNG文件采用LZ77算法的派生算法進行壓縮,可獲得高的壓縮比。其編碼方法可標記重復出現的數據,因而對圖像的顏色沒有影響,也不會產生顏色的損失,因此可以重復保存而不降低圖像質量。

(3)索引彩色模式。PNG-8格式與GIF圖像類似,采用8位調色板將RGB彩色圖像轉換為索引彩色圖像。圖像中保存的不再是各個像素的彩色信息,而是從圖像中挑選出來的具有代表性的顏色編號,每一編號對應一種顏色,圖像的數據量也因此減少,這對彩色圖像的傳輸非常有利。

(4)優化的網絡傳輸性。PNG圖像在瀏覽器上采用流式瀏覽,圖像即使經過交錯處理,在完成下載之前,可提供一個基本的圖像內容,然后再逐漸顯示出清晰圖像。它允許連續讀出和寫入圖像數據,這個特性很適合在通信過程中顯示和生成圖像。

(5)支持透明效果。PNG可以為原圖像定義256個透明層次,使得彩色圖像的邊緣能與任何背景平滑地融合,從而徹底地消除鋸齒邊緣,這一功能是GIF和JPEG沒有的。

(6)PNG同時還支持真彩和灰度級圖像的Alpha通道透明度。

2. PNG文件結構

PNG文件整體上由PNG文件標志(PNG file signature)和數據塊(chunks)兩部分構成。即PNG圖像格式文件(或者稱為數據流)由一個8字節的PNG文件署名域和按照特定結構組織的3個以上的數據塊組成。文件的數據塊部分一般由3個以上的PNG的數據塊按照特定的順序組成,因此,一個標準的PNG文件結構應該如圖2-9所示。

圖2-9 標準的PNG文件結構

1)PNG文件標志

PNG文件署名域由8字節的數據組成,用于識別該文件是否PNG文件。該域的值如表2-3所示。

表2-3 PNG文件署名域的值

其中第一個字節0x89超出了ASCII字符的范圍,這是為了避免某些軟件將PNG文件當做文本文件處理。

2)PNG數據塊

PNG定義了兩種類型的數據塊:一種稱為關鍵數據塊(critical chunk),這個標準數據塊是必需的;另一種稱為輔助數據塊(ancillary chunks),是可選數據塊。關鍵數據塊定義了4個標準數據塊,每個PNG文件都必須包含它們,PNG讀寫軟件也需支持這些數據塊。雖然PNG文件規范沒有要求PNG編譯碼器對可選數據塊進行編碼和譯碼,但規范提倡支持可選數據塊。

表2-4所示是PNG數據塊類別(關鍵數據塊部分用深色背景加以區分)。

表2-4 PNG文件格式中的數據塊

為簡單和方便,假設在本節所使用的PNG圖像文件中,這4個數據塊按表2-4所示的先后順序進行存儲,并且只出現一次。

(1)數據塊結構。PNG文件中,每個數據塊由4個部分組成,如表2-5所示。

表2-5 PNG數據塊的結構

CRC(cyclic redundancy check)域中的數據是對chunk type code域和chunk data域中的數據進行計算得到的,CRC算法在ISO 3309和ITU-T V.42中定義。

(2)IHDR。文件頭數據塊IHDR(header chunk)包含有PNG文件中存儲的圖像數據的基本信息,并作為第一個數據塊出現在PNG數據流中,而且一個PNG數據流中只能有一個文件頭數據塊。

文件頭數據塊由13字節組成,它的格式如表2-6所示。

表2-6 文件頭數據塊的組成

(3)PLTE。調色板數據塊PLTE(palette chunk)包含與索引彩色圖像(indexed-color image)相關的彩色變換數據,它僅與索引彩色圖像有關,而且應置于圖像數據塊(image data chunk)之前。

PLTE數據塊是定義圖像的調色板信息,PLTE可以包含1~256個調色板信息,每一個調色板信息由3個字節組成,如表2-7所示。

表2-7 調色表信息表

因此,調色板的長度是3的倍數,否則是一個非法的調色板。對于索引圖像,調色板信息是必須的,調色板的顏色索引從0開始編號,然后是1、2……調色板的顏色數不能超過色深中規定的顏色數(如圖像色深為4,調色板的顏色數為16),否則將導致PNG圖像不合法。

真彩色圖像和帶α通道數據的真彩色圖像也可以有調色板數據塊,目的是便于非真彩色顯示程序用它來量化圖像數據,從而顯示該圖像。

(4)IDAT。圖像數據塊IDAT(image data chunk)用于存儲PNG圖像的灰度數據,在數據流中可包含多個連續順序的圖像數據塊。

(5)IEND。圖像結束數據IEND(image trailer chunk)用于標記PNG文件或者數據流已經結束,并且必須放在文件的尾部。PNG文件總是以“00 00 00 00 49 45 4E 44 AE 42 60 82”12個字符結束。這是因為根據數據塊結構的定義,IEND數據塊的長度總是0(00 00 00 00),數據標識為IEND(49 45 4E 44),因此,CRC碼是AE 42 60 82。

2.5.4 TIFF文件

TIFF即標簽圖像文件格式(tagged image file format),以.tif為擴展名,是一種主要用于存儲包括照片和藝術圖片在內的圖像的文件格式。它最初由Aldus和微軟一起為PostScript打印而開發。TIFF格式支持256色、24位真彩色、32位、48位等多種色彩位,同時支持RGB、CMYK及YCbCr等多種彩色模式,并支持多平臺。TIFF文件可以不壓縮(文件較大)也可以壓縮,支持RAW、RLE、LZW、JPEG、CCITT 3組和4組等多種壓縮方式,用Photoshop編輯的TIFF文件可以保存路徑和圖層,絕大多數圖像系統都支持這種格式。

TIFF在業界得到了廣泛的支持,如Adobe公司的Photoshop、Jasc的GIMP、Ulead PhotoImpact和Paint Shop Pro等圖像處理應用、QuarkXPress和Adobe InDesign桌面印刷和頁面排版應用,掃描、傳真、文字處理、光學字符識別和一些其他應用等都支持該格式。TIFF與JPEG和PNG一起成為流行的高位彩色圖像格式,TIFF文件是最復雜的一種位圖文件格式,它廣泛應用于對圖像質量要求較高的圖像存儲與轉換。由于TIFF格式結構靈活、包容性大,因此已成為圖像文件格式的一種標準。

TIFF最初的目的是為20世紀80年代中期桌面掃描儀廠商避免每商家都使用自己的格式而達成的一個公用統一的掃描圖像文件格式。當時的桌面掃描儀只能處理二值圖像,因此初期TIFF也只是二值圖像格式,隨著掃描儀的功能越來越強大,TIFF逐漸支持灰度圖像和彩色圖像。

1. TIFF文件結構

TIFF文件數據格式由圖像文件頭、圖像文件目錄、目錄入口和圖像數據4個部分組成,如圖2-10所示。

圖2-10 TIFF文件格式的結構

TIFF文件的應用非常廣泛,這是因為:

(1)TIFF可以描述多種類型的圖像。

(2)TIFF擁有一系列的壓縮方案可供選擇。

(3)TIFF不依賴于具體的硬件。

(4)TIFF是一種可移植的文件格式。

(5)TIFF是一種主要的壓縮方法。

(6)多種色彩表示方法。

2. 文件頭

每一個TIFF文件的第一個數據結構稱為圖像文件頭(image file header, IFH),它是圖像文件體系結構的最高層。文件頭部分共8字節,格式如圖2-11所示。

圖2-11 文件頭格式

這個結構在一個TIFF文件中是唯一的,有固定的位置,位于文件的開始部分,包含了正確解釋TIFF文件其他部分所需的必要信息。

3. 文件目錄

文件目錄(image file directory, IFD)是TIFF文件的第2個數據結構,包含了文件的重要信息,即IFD提供了一系列的指針,這些指針包含了各種有關的數據字段在文件中的開始位置,并給出每個字段的數據類型及長度。其格式如圖2-12所示。

一個TIFF圖像可有多個IFD,說明該文件有多幅圖像。每一個標記一幅圖像的基本屬性。IFD結構包含3個成員,其中項數(directory entry count)占2字節,指出該結構有多少個目錄入口;隨后是線性排列的Directory Entry序列,數量不定,這就是TIFF文件稱為可擴充標記的文件的原因,用戶甚至可以添加自定義的標記屬性,每一個directory entry標記了圖像的某一屬性;最后一個成員是偏移量,標記下一個文件目錄相對于文件開始處的位置。

圖2-12 文件目錄格式

4. 目錄入口

每個目錄入口(directory entry, DE)共由12字節組成,格式如圖2-13所示。

圖2-13 目錄入口格式

一個DE就是一幅圖像的某一屬性,它包含圖像的大小、分辨率、壓縮信息、像素的行與列數量、每一像素由幾位表示(1表示二值圖像,8代表256色)等。目錄入口中的Tag成員是該屬性的編號,編號按升序排列。第2個成員是數據類型,共有5種數據類型。第3個成員是數據的長度,第4個成員是到Z值的偏移量,是指Tag標識的代表的變量值相對于文件開始處的偏移量,如果該值小于4字節,則直接將該值存放即可。

5. 圖像數據

根據IFD所指向的地址,緊隨上述數據之后就是圖像數據;圖像數據的存儲形式有不同的方式。TIFF-B用于二值圖像,TIFF-G用于灰度圖像,TIFF-P用于帶調色板的圖像,TIFF-R用于RGB真彩色圖像。

TIFF文件格式適于在應用程序之間和計算機平臺之間的文件交換,它的出現使得圖像數據交換變得簡單。TIFF是一個靈活適應性強的文件格式,通過在文件頭中包含“標簽”它能夠在一個文件中處理多幅圖像和數據。標簽能夠標明圖像的大小或定義圖像數據如何排列及是否使用壓縮選項。如TIFF可以包含JPEG和行程長度編碼壓縮的圖像。TIFF文件也可包含基于矢量的裁剪區域(剪切或者構成主體圖像的輪廓)。使用無損格式存儲圖像的能力使TIFF文件成為圖像存檔的有效方法。與JPEG不同,TIFF文件可以編輯然后重新存儲而不會有壓縮損失。

每個TIFF文件都是從指示字節順序的兩個字節開始的。II表示小字節在先,MM表示大字節在先。后面兩個字節表示數字42。42的讀取方法取決于頭兩個字節所表示的字節順序。整個文件根據所指出的字節順序進行讀取。

TIFF的最大局限在于用4byte表示偏移量,這樣導致文件大小的上限為4GB。在20年前制定TIFF標準時4GB足夠大,但現在卻成了制約TIFF的一個瓶頸。目前BigTIFF已經提出用8個字節來表示偏移量。這樣數據量應該足夠大了。此外,TIFF文件的復雜性給它的應用帶來了一些問題。

2.5.5 GIF文件

GIF(graphics interchange format)即圖像互換格式,是CompuServe于1987年開發出來的圖像文件格式。GIF文件的數據采用了一種基于LZW算法的連續色調的無損壓縮格式,允許用戶為圖像設置背景的透明屬性,其壓縮率一般在50%左右,它不屬于任何應用程序。目前幾乎所有相關軟件都支持GIF,GIF圖像文件是一種在網絡上非常流行的圖形文件格式。GIF圖像文件格式的特點之一是數據是經過壓縮的,其采用的是可變長度壓縮算法。GIF格式的另一個特點是其在一個GIF文件中可以存多幅彩色圖像,若將存儲在一個文件中的多幅圖像數據逐幅讀出并顯示到屏幕上,就可構成一種最簡單的動畫。

GIF格式由CompuServe引入應用后,因其體積小和成像相對清晰,在早期的互聯網上大受歡迎。GIF文件采用無損壓縮技術,對于256色以內的圖像,則可既減少文件的大小,又保持圖像的質量。GIF圖像是基于顏色列表的(存儲的數據是該點顏色對應于顏色表的索引值),最多支持8位(256色)。GIF文件內部分成許多存儲塊,用于存儲多幅圖像或者是決定圖像表現行為的控制塊,用以實現動畫和交互式應用。

GIF主要分為兩個版本,即GIF 89a和GIF 87a。

(1)GIF87a:1987年制定的版本。

(2)GIF89a:1989年制定的版本。在該版本中,為GIF文檔擴充了圖形控制區塊、備注、說明、應用程序編程接口等四個區塊,并提供了對透明色和多幀動畫的支持。

GIF文件內部是按塊劃分的,包括控制塊和數據塊兩種。控制塊控制數據塊的行為,不同的控制塊包含不同的控制參數。數據塊只包含一些8bit的字符流,由它前面的控制塊來決定它的功能,數據塊長度為0~255字節,數據塊的第一個字節是該數據塊的長度,計算數據塊的長度時不包括這個字節,所以一個空的數據塊也有一個字節,那就是數據塊的大小&H00。控制塊中的邏輯屏幕描述塊和全局彩色表的作用范圍是整個數據流,其他控制塊僅控制跟在它們后面的圖形描述塊。一個GIF文件的結構可分為文件頭(file hearder)、GIF數據流(GIF data stream)和文件結束塊(trailer)三個部分。GIF文件的典型結構如表2-8所示。

表2-8 GIF文件的基本結構

根據表2-8所示的基本結構,對GIF文件詳述如下。

1. GIF文件頭

GIF文件頭描述塊定義GIF數據流,文件頭由GIF標記域(signature)和版本號(version)域組成,是一個由6個固定字節組成的數據塊,它們用來說明使用的文件是GIF格式及當前的版本號,標志域和版本域各占3字節。GIF標記域存放的是GIF,版本號域存放的是1987年5月發布的87a或1989年7月發布的89a,或更新的版本號。

GIFHEADER結構定義如下:

2. 邏輯屏幕描述塊

邏輯屏幕描述塊(logical screen descriptor)包含定義圖像顯示區域的參數,包括背景顏色信息。這個數據塊中的坐標是相對于虛擬屏幕的左上角開始的,不一定是指顯示屏的絕對坐標,因此可以參照窗口軟件環境下的窗口坐標或者打印機坐標來設計圖像顯示程序。邏輯屏幕描述塊的結構如表2-9所示。

表2-9 邏輯屏幕描述塊的結構

GIFSCRDESC結構定義如下:

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

(1)屏幕描述塊中的第5個字節稱為包裝域(packed fields),它由4個子域組成:

①全局彩色表標志(global color table flag)域G用來說明是否有全局彩色表存在。若G=1,表示有一個全局彩色表將緊跟在這個邏輯屏幕描述塊之后;這個標志也用于選擇背景顏色索引(background color index)。如果G=1,背景顏色索引域中的值就用作背景顏色的索引。

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

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

④全局彩色表大小(size of global color table)域Size表示每個像素的位數,它用于計算全局彩色表中包含的字節數。在全局彩色表標志域G=0時就不用計算,G=1時就需計算彩色表的大小,具體計算參考本節全局彩色表。

(2)屏幕描述塊中的第6個字節是背景顏色索引,它是彩色表的一個索引值,用于指定背景顏色。若全局彩色表標志域G=0,這個域的值也設置為0。

(3)像素寬高比(pixel aspect ratio)域中的值是一個因數,是計算原始圖像像素的寬高比的一個近似值。該域的值范圍為1~255。若該值不等于0,則寬高比的近似值按下式計算:

Aspect Ratio=(Pixel Aspect Ratio+15)/64

像素寬高比定義成像素的寬度與高度之比,比值的范圍在4:1~1:4之間,其增量為1/64。

3. 全局彩色表

由于一個GIF文件可以包含多幅彩色圖像,每幅彩色圖像也許都包含適合自身特點的彩色表,因此一個GIF文件可以有好幾個彩色表。但歸納起來只有兩類:全局彩色表和局部彩色表。全局彩色表可用于圖像本身沒有帶彩色表的所有圖像和無格式文本擴展塊(plain text extension)圖像,而局部彩色表只用于緊跟在它后面的一幅圖像。在處理全局彩色表和局部彩色表時需要注意如下規則。

(1)如果GIF文件包含全局彩色表,而且要顯示的圖像本身又帶有局部彩色表,則顯示該幅彩色圖像時就用自有的彩色表,而不用全局彩色表。在這種情況下,解碼器就首先保存全局彩色表,然后使用局部彩色表顯示圖像,最后再恢復全局彩色表。

(2)全局彩色表和局部彩色表都是可選的。基于此,解碼器最好要保存全局彩色表直到出現另一個全局彩色表為止。這樣,對于包含完全沒有彩色表的一幅或者多幅彩色圖像的GIF文件就可以使用最后保存的全局彩色表進行處理。

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

(4)全局彩色表是否存在由邏輯屏幕描述塊中第5字節的全局彩色表標志域G的值確定,若存在,彩色表就緊跟在邏輯屏幕描述塊之后。

4. 圖像描述塊

GIF圖像文件格式可包含多幅圖像,而且無固定存放順序,僅用一個字節圖像分隔符(image separator)來判斷是否為圖像描述塊。每一幅圖像都由一個圖像描述塊、局部彩色表(該表可以沒有)和圖像數據組成。每幅圖像必須在邏輯屏幕描述塊中定義的邏輯屏尺寸范圍內。圖像描述塊之前可以有一個或者多個控制塊,如圖形控制擴展塊之后可有一個局部彩色表。無論前后是否有各種數據塊,圖像描述塊總是帶有圖像數據。圖像描述塊的結構如下。

圖像描述塊的第9個字節稱為包裝域(packed fields)字節,它由5個子域組成:

(1)局部彩色表標志域L用于說明是否有局部彩色表存在。如果L=1,表示有一個局部彩色表將緊跟在這個圖像描述塊之后;如果G=0,表示圖像描述塊后面沒有局部彩色表,該圖像將使用全局彩色表。

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

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

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

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

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

顯示圖像需要較長的時間,使用這種方法存放和顯示圖像數據可以在圖像顯示完成之前看到這幅圖像的概貌,而不覺得顯示時間長。

(3)彩色表排序標志域的含義與全局彩色表中域的含義相同。

(4)保留(reserved)。

(5)局部彩色表大小域的值用于計算局部彩色表中所包含的字節數。

5. 局部彩色表

局部彩色表用于緊跟在它后面的圖像。彩色表是否存在取決于圖像描述塊中局部彩色表標志位的設置,彩色表的結構和大小與全局彩色表完全相同。

6. 表基圖像數據

GIF圖像采用了LZW算法對圖像數據進行壓縮。為提高壓縮編碼的效率,對LZW編碼器輸出的代碼采用可變長度碼VLC。表基圖像數據(table based image data)由LZW最小代碼長度和圖像數據組成,LZW最小代碼長度域的值用于確定圖像數據中LZW代碼使用的初始位數。圖像數據由數據子塊(data sub-blocks)序列組成。數據子塊的結構是一個可變長度的數據塊,其長度由塊大小域(block size)域中的值確定,字節數為0~255。

7. 圖形控制擴展塊

圖形控制擴展塊(graphic control extension)包含處理圖形描繪塊時需使用的參數,它的結構說明如下:

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

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

(3)塊大小(block size)用于說明該擴展塊所包含字節數,該字節數是從這個塊大小域之后到塊結束符之間的字節數。控制塊數據結果如下:

(4)處理方法(disposal method)規定圖形顯示之后譯碼器要用規定的方法進行處理。用戶輸入標志(user input flag)域表示在繼續處理之前是否需要用戶輸入響應。在延時時間和用戶輸入標志都設置為1的情況下,繼續處理的開始時間取決于用戶響應輸入在前還是延時時間結束在前。

(5)透明(transparency flag)表示是否給出透明索引。

(6)延時時間(delay time)用于指定在圖形顯示之后繼續處理數據流之前的等待時間,一百分之一秒為單位。

(7)當且僅當透明標志位設置為1時,透明索引用于指示處理程序是否要修改顯示設備上的相應像點。當且僅當透明標志位設置為1時,就要修改。

(8)塊結束符(block terminator)表示該圖形控制擴展塊結束,它是由一個字節組成的數據塊,該域的值是一個固定的值0x00。

8. 無格式文本擴展塊

無格式文本擴展塊即圖像說明擴充塊,無格式文本擴展塊包含文本數據和描繪文本所需的參數。文本數據用7位的ASCII字符編碼并以圖形形式顯示。擴展塊的結構如下。

其中,byBlockSize用于指定該圖像擴充塊的長度,取值為13;wTextGridLeft用于指定文字顯示方格相對于邏輯屏幕左上角的X坐標(像素);wTextGridTop用于指定文字顯示方格相對于邏輯屏幕左上角的Y坐標;wTextGridWidth用于指定文字顯示方格的寬度;wTextGridDepth用于指定文字顯示方格的高度;byCharCellWidth用于指定字符的寬度;byCharCellDepth用于指定字符的高度;byForeColorIndex用于指定字符的前景色;byBackColorIndex用于指定字符的背景色。

9. 注釋擴展塊

注釋擴展塊(comment extension)域的內容用于說明圖形、作者或者其他任何非圖形數據和控制信息的文本信息。其中的注釋數據是序列數據子塊,每塊字節數為1~255。

10. 應用程序擴展塊

應用程序擴展塊(application extension)包含制作該圖像文件的應用程序的相關信息,GIF中用識別碼0xFF來判斷一個擴充塊是否為應用程序擴充塊。它的結構定義如下:

其中,byBlockSize用于指定該應用程序擴充塊的長度,其值為12;byIdentifier用于指定應用程序名稱;byAuthentication用于指定應用程序的識別碼。

11. GIF文件結束塊

結束塊(GIF trailer)表示GIF文件的結尾,它包含一個固定的數值0x3B。

主站蜘蛛池模板: 太白县| 福清市| 安义县| 黄骅市| 恩施市| 丰县| 天津市| 鄂州市| 达州市| 潞西市| 南涧| 炎陵县| 兴海县| 濮阳市| 宝清县| 资溪县| 乌鲁木齐县| 义乌市| 丘北县| 蚌埠市| 瑞金市| 文昌市| 多伦县| 岚皋县| 昭通市| 车致| 策勒县| 平原县| 古交市| 宣威市| 集贤县| 山阴县| 兴海县| 城口县| 庐江县| 元氏县| 衢州市| 林州市| 浙江省| 临高县| 丹棱县|