常見圖片文件格式簡析


“常見”:此處指BMP JPEG GIF PNG 四種。

 

軟件:

Windows 畫圖(除了Photoshop,我最喜歡的編輯器,簡單粗暴)

HxD

 

 

BMP

BMP文件分為4部分:

bmp文件頭(bmp file header):14Byte。提供文件的格式、大小等信息 。

位圖信息頭(bitmap information):40Byte。提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息 。

調色板(color palette):大小由顏色索引數決定。可選,如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表 。

位圖數據(bitmap data):大小由圖像尺寸決定。圖像數據。

 

存儲數據時,一個地址存儲一字節。如果一個數據需要用多個字節表示,就要跨地址,那么存儲該數據的順序就分為兩種:高地址存儲高位數據,低地址存儲低位數據(小端方式,Little Endian,利於計算機處理);高地址存儲低位數據,低地址存儲高位數據(大端方式,Big Endian,和人類一般思維類似)。BMP文件采用小端方式,高地址存儲高位數據,低地址存儲低位數據。甩兩個鏈接:

http://blog.csdn.net/hackbuteer1/article/details/7722667

http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html

 

文件頭:

變量名

地址偏移

大小

作用

bfType

0000h

2 Bytes

文件類型,

BM:Windows 3.1x,95,NT

BA,CI,CP,IC,PT:與 OS/2有關

bfSize

0002h

4 Bytes

文件大小,單位Byte

bfReserved1

0006h

2 Bytes

保留,必須為0

bfReserved2

0008h

2 Bytes

保留,必須為0

bfOffBits

000Ah

4 Bytes

從文件頭到位圖數據的偏移量(Byte)。由於調色板有無、長度不同,用於迅速從文件定位到位圖數據。

 

以下,0d**** 為十進制(decimal),0x****十六進制(hexadecimal)。兩個16進制數可以寫成8位2進制數,因此是1 Byte。

對於本圖,

42 4D :BM,Windows位圖

36 DB 01 00:小端方式,= 0x0001DB36 =0d121654(Byte) = 118 KiB。與查看一致。(大小: 118KB(121,654字節) )

第一行的 06 到 09 ,4 Byte的00:兩個保留位。

接下來 : 36 00 00 00,表示偏移 0x36 = 0d54字節。定位過去是 0036h 位置的17

 

位圖信息頭:

位圖信息圖說明:

這個位圖信息頭的大小為40個字節。位圖信息頭一般有40個字節,既然是這樣,為什么這里還要給一個字段來說明呢?這里涉及到一些歷史,其實位圖信息頭原本有很多大小的版本的。

 

調色板

甩個鏈接: http://blog.csdn.net/qsycn/article/details/7801145

調色板(color table)是單色、16色和256色圖像文件所特有的,相對應的調色板大小是2、16和256,調色板以4字節為單位,每4個字節存放一個顏色值,圖像的數據是指向調色板的索引。

字  段  名

大小(單位:字節)

描    述

rgbBlue

1

藍色值

rgbGreen

1

綠色值

rgbRed

1

紅色值

rgbReserved

1

保留,總為0

 

如果圖像是單色、16色和256色,則緊跟着調色板的是位圖數據,位圖數據是指向調色板的索引序號。

 

但是:

      如果位圖是16位、24位和32位色,則圖像文件中不保留調色板,即不存在調色板,圖像的顏色直接在位圖數據中給出。

      16位圖像使用2字節保存顏色值,常見有兩種格式:5位紅5位綠5位藍和5位紅6位綠5位藍,即555格式和565格式。555格式只使用了15位,最后一位保留,設為0。

      24位圖像使用3字節保存顏色值,每一個字節代表一種顏色,按紅、綠、藍排列。

      32位圖像使用4字節保存顏色值,每一個字節代表一種顏色,除了原來的紅、綠、藍,還有Alpha通道,即透明色。

      如果圖像帶有調色板,則位圖數據可以根據需要選擇壓縮與不壓縮,如果選擇壓縮,則根據BMP圖像是16色或256色,采用RLE4或RLE8壓縮算法壓縮。

 

位圖數據

位圖信息頭中,大多數BMP文件的biHeight為正數,表示圖像是倒像位圖。所以位圖數據在文件中的排列順序是從左下角到右上角,以行為主序排列。

24位RGB按照BGR的順序來存儲每個像素的各顏色通道的值,一個像素的所有顏色分量值都存完后才存下一個下一個像素,不進行交織存儲。 

32位數據按照BGRA的順序存儲,其余與24位位圖的方式一樣。A是透明色,Alpha通道。

數據的對齊規則:

Windows默認的掃描的最小單位是4字節,如果數據對齊滿足這個值的話對於數據的獲取速度等都是有很大的增益的。因此,BMP圖像順應了這個要求,要求每行的數據的長度必須是4的倍數,如果不夠需要進行比特填充(以0填充),這樣可以達到按行的快速存取。這時,位圖數據區的大小就未必是 圖片寬×每像素字節數×圖片高 能表示的了,因為每行可能還需要進行比特填充。

 

最后甩個詳細鏈接:

http://wenku.baidu.com/link?url=wI_UlD_9vezTJ-t7a-uBE9IS_tHPszEByGExCJ5QpnQ2wfjmFbMtee3MdczFDW5GSq60Od3Y-8NMikH68V2zNRrdXznOv7nFJS-jPRgqfPy#39124-qzone-1-24262-f00cdc7f4857236c67481f200187bab5

 

JPEG

JPEG(發音為jay-peg, IPA:[ˈdʒeɪpɛg])是一種針對相片圖像而廣泛使用的一種有損壓縮標准方法。這個名稱代表Joint Photographic Experts Group(聯合圖像專家小組)。

JPEG圖像存儲格式一個比較成熟的圖像有損壓縮格式,雖然一個圖片經過轉化為JPEG圖像后,一些數據會丟失,但是,人眼是很不容易分辨出來這種差別的。也就是說,JPEG圖像存儲格式既滿足了人眼對色彩和分辨率的要求,又適當的去除了圖像中很難被人眼所分辨出的色彩,在圖像的清晰與大小中JPEG找到了一個很好的平衡點。

JPEG的圖片使用的是YCrCb顏色模型,而不是計算機上最常用的RGB.關於色彩模型,這里不多闡述.只是說明,YCrCb模型更適合圖形壓縮.因為人眼對圖片上的亮度Y的變化遠比色度C的變化敏感.我們完全可以每個點保存一個8bit的亮度值,每2x2個點保存一個Cr Cb值,而圖象在肉眼中的感覺不會起太大的變化。

JPEG文件中的字節是按照大端方式排列的,高地址存儲低位數據,低地址存儲高位數據。見前文。

關於有損壓縮的原理,涉及高等數學原理,甩一個鏈接:http://zh.wikipedia.org/zh-cn/JPEG

由於早期操作系統只支持3個字符擴展名,因此 .JPG 廣泛沿用至今。

一個由C-Cube Microsystems等公司所創建的額外標准,稱為JFIF(JPEG File Interchange Format,JPEG文件交換格式)詳細說明如何從一個JPEG流,產出一個適合於電腦存儲和傳輸(像是在互聯網上)的文件。在普遍的用法,當有人稱呼一個"JPEG文件",一般而言他是意指一個JFIF文件,或有時候是一個Exif JPEG文件。然而,也有其他以JPEG為基礎的文件格式,像是JNG。

JFIF的文件結構:

甩一個鏈接:http://baike.baidu.com/view/1326314.htm?fr=aladdin#3

JFIF文件格式直接使用JPEG標准為應用程序定義的許多標記,因此JFIF格式成了事實上JPEG文件交換格式標准。JPEG的每個標記都是由2個字節組成,其前一個字節是固定值0xFF。每個標記之前還可以添加數目不限的0xFF填充字節(fill byte)。下面是其中的8個標記:

SOI 0xD8  圖像開始

APP0 0xE0  JFIF應用數據塊

APPn 0xE1 - 0xEF  其他的應用數據塊(n, 1~15)

DQT 0xDB  量化表

SOF0 0xC0  幀開始

DHT 0xC4  霍夫曼(Huffman)表

SOS 0xDA  掃描線開始

EOI 0xD9  圖像結束

 

圖像開始

SOI(Start of Image)標記 0h 2Byte 0xFFD8

 

APP0標記(Marker)

0h 2字節 0xFFE0

① APP0長度(length)(①~⑨九個字段的總長度)

2h 2字節內容不定(①~⑨九個字段的總長度)

② 標識符(identifier)

4h 5字節 0x4A46494600 即“JFIF0”

③ 版本號(version)

9h 2字節 0x0102 JFIF的版本號目前基本上都是1.2

④ X和Y的密度單位(units=0:無單位;units=1:點數/英寸;units=2:點數/厘米)

bh 1字節只有0,1,2三個值可選,其分別代表的意義如上]

⑤ X方向像素密度(X density)

ch 2字節取值范圍未知

⑥ Y方向像素密度(Y density)

eh 2字節取值范圍未知

⑦ 縮略圖水平像素數目(thumbnail horizontal pixels)

10h 1字節取值范圍未知

⑧ 縮略圖垂直像素數目(thumbnail vertical pixels)

11h 1字節取值范圍未知

⑨ 縮略圖RGB位圖(thumbnail RGB bitmap)

12h 長度可能是3的倍數內容不定

本段(APP0)可以包含圖像的一個微縮版本,存為24位的RGB像素。如果沒有微縮圖像(這種情況更常見),則⑦“縮略圖水平像素數目”和⑧“縮略圖垂直像素數目”的值均為0。

APPn標記(Markers)

① APPn長度(length)(①②兩個字段的總長度)

② 詳細信息(application specific information)

對每個APP:

若為APPN(N=1~F(以16進制表示,N任選其中一個))

· 標記: mh 2字節 0xFFEN

· 長度:(m+2)h 2字節內容不定(設為n(10進制))(本字段與下一字段的總長度)

· 詳細信息: (m+4)h n-2字節(即長度減2)內容不定

一個或者多個量化表DQT

DQT(Difine Quantization Table)

0h 2字節 0xFFDB

① 量化表長度(quantization table length)(①~②兩個字段的總長度)

2h 2字節內容不定(①~②兩個字段的總長度)

② 量化表(quantization table)

A. P/T(高四位:精度,低四位:表ID)

B. 表項

對每個量化表:

· P/T(高四位:精度,低四位:表ID) mh 1字節精度, 0 表示 8 bit, 1表示 16 bit;ID取值范圍為0~3, 否則錯誤

· 表項 (m+1)h (64×(精度+1))字節內容長,故略

(5) 幀圖像開始SOF0(Start of Frame)

0h 2字節 0xFFC0

① 幀開始長度(start of frame length) (①~⑥六個字段的總長度)

2h 2字節內容不定(①~⑥六個字段的總長度)

② 精度(precision),每個顏色分量每個像素的位數(bits per pixel per color component)

4h 1字節每個樣本位數, 通常是 8 (大多數軟件不支持 12 和 16)

③ 圖像高度(image height) 5h 2字節內容不定(如果不支持 DNL 就必須 >0)

④ 圖像寬度(image width) 7h 2字節內容不定(如果不支持 DNL 就必須 >0)

⑤ 顏色分量數(number of color components)

9h 1字節內容不定(灰度圖是 1, YCbCr/YIQ 彩色圖是 3, CMYK 彩色圖是 4,我們這里討論的JFIF使用的是YCbCr,故這里顏色分量數為3)

⑥ 對每個顏色分量(for each component)

A. ID

B. 垂直方向的樣本因子(vertical sample factor)

C. 水平方向的樣本因子(horizontal sample factor) B、C共占用1字節,B占用低4位,C占用高4位)

D. 量化表號(quantization table#)

JFIF格式使用的是YCbCr所以有3個分量(這里特別要注意的是顏色分量的ID號是有含義的,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):

1) ID

ah 1字節 0x01

(高四位)水平(低四位)垂直樣本因子

bh 共1字節 0x227

量化表號

ch 1字節內容不定(本分量使用的量化表的ID號)

2) ID

dh 1字節 0x02

(高四位)水平(低四位)垂直樣本因子

eh 共1字節 0x11J

量化表號

fh 1字節內容不定(本分量使用的量化表的ID號)

3) ID

10h 1字節 0x03

(高四位)水平(低四位)垂直樣本因子

11h 共1字節 0x11

量化表號

12h 1字節內容不定(本分量使用的量化表的ID號)

一個或者多個霍夫曼表DHT

DHT (Difine Huffman Table)

0h 2字節 0xFFC4

① 霍夫曼表的長度(Huffman table length) (①~②兩個字段的總長度)

2h 2字節內容不定(①~②兩個字段的總長度)

② 對每個霍夫曼表(一般情況下,霍夫曼表不止一個,但是絕對不多於4個)

A. 表號

B. 類型:AC或者DC(其中0:DC表,1:AC表);A、B共占用1字節,A占用低4位,B占用高4位)

C. 長16個字節的編碼,其代碼代數和為接下來的編碼的長度

D. 內容編碼

對每個霍夫曼表:

·(高四位)類型和(低四位)表號: mh 共1字節內容不定(有四個可能:0x00表示第0個DC表,0x01表示第1個DC表,0x10表示第0個AC表,0x11表示第1個AC表)

· 長16個字節的編碼: (m+1)h 16字節內容不定(設這16個字節上數據之和為n)

· 內容編碼: (m+17)h n字節內容長,故略)

定義重新開始間隔DRI

DRI (Define Restart Interval)

(在沒有DRI標記,或間隔為零時,就不存在重新開始間隔和重開始標記)

0h 2字節 0xFFDD

① 長度 2h 2字節 0x0004(①~②兩個字段的總長度)

② MCU 塊的單元中的重新開始間隔

4h 2字節內容不定(設為n,則意思是說,每n個MCU塊就有一個RSTn標記。第一個標記是RST0,然后是RST1等,RST7后再從RST0重復)

掃描開始SOS

SOS(Start of Scan)

0h 2字節 0xFFDA

① 掃描開始長度(start of scan length)

2h 2字節內容不定(①~③再加上④的A\B\C的總長度)

② 顏色分量數(number of color components)

4h 1字節應該和⑸⑤的值相同(灰度圖是1, YCbCr/YIQ 彩色圖是3, CMYK 彩色圖是4)

③ 每個顏色分量

A. ID

B. 交流系數表號(AC table #)

C. 直流系數表號(DC table #)

(B、C共占用1字節,B:占用低4位,C:占用高4位)

由②得到這里的顏色分量數為3(這里的顏色分量的ID號的含義和⑸⑥的一樣,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):

1) ID

5h 1字節 0x01 (高四位)直流(低四位)交流數表號

6h 共1字節 0x00

2) ID

7h 1字節 0x027 (高四位)直流(低四位)交流數表號

8h 共1字節 0x11

3) ID

9h 1字節 0x03 (高四位)直流(低四位)交流數表號

ah 共1字節 0x11

④ 壓縮圖像數據(compressed image data)

A. 譜選擇開始 bh 1字節 0x00

B. 譜選擇結束 ch 1字節 0x3F

C. 兩個4位字段,高位和低位的譜選擇 dh 1字節在基本JPEG中總為0x00

D. 數據 eh 長度不定內容長,故略

圖像結束EOI

EOI (End of Image)

0h 2字節 0xFFD9

 

GIF

GIF(Graphics Interchange Format)的原義是“圖像互換格式”,是CompuServe公司在 1987年開發的圖像文件格式。GIF文件的數據,是一種基於LZW算法的連續色調的無損壓縮格式。其壓縮率一般在50%左右,它不屬於任何應用程序。目前幾乎所有相關軟件都支持它,公共領域有大量的軟件在使用GIF圖像文件。GIF圖像文件的數據是經過壓縮的,而且是采用了可變長度等壓縮算法。GIF格式的另一個特點是其在一個GIF文件中可以存多幅彩色圖像,如果把存於一個文件中的多幅圖像數據逐幅讀出並顯示到屏幕上,就可構成一種最簡單的動畫。

圖像互換格式主要分為兩個版本,即圖像互換格式87a和圖像互換格式89a。

圖像互換格式87a:是在1987年制定的版本。

圖像互換格式89a:是在1989年制定的版本。在這個版本中,為圖像互換格式文檔擴充了圖形控制區塊、備注、說明、應用程序接口等四個區塊,並提供了對透明色和多幀動畫的支持。

特點:

優秀的壓縮算法使其在一定程度上保證圖像質量的同時將體積變得很小。

可插入多幀,從而實現動畫效果。

可設置透明色以產生對象浮現於背景之上的效果。

由於采用了8位元壓縮,最多只能處理256種顏色,故不宜應用於真彩色圖片。

 

Header 

GIF 文件頭

 

Logical Screen Descriptor   

邏輯屏幕描述塊   

 

 Global Color Table   

全局彩色表    

 

 „ 擴展模塊(任選) „     

 

 

   Image Descriptor  

 圖形描述塊 

 

   Local Color Table  

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

Table Based Image Data   

表式壓縮圖像數據  

 Graphic Control Extension 

  圖像控制擴展塊 

 Plain Text Extension   

無格式文本擴展塊 

n

 Comment Extension   

注釋擴展塊 

 Applicaton Extension   

應用程序擴展塊     

 

„ 擴展模塊(任選) „  

   

 

  GIF Trailer 

GIF文件結束塊 

 

 

由上表可知,一個GIF文件的結構可分 為文件頭(File Header)、GIF數據流(GIF Data Stream)和文件終結器(Trailer)三個部分。文件頭包含GIF文件署名(Signature)和版本號(Version);GIF數據流由控 制標識符、圖象塊(Image Block)和其他的一些擴展塊組成;文件終結器只有一個值為0x3B的字符(';')表示文件結束。

 

GIF文件頭:(6個字節)

標識符(3字節) ---GIF

版本(3字節) ---87a (or 89a)

 

GIF數據流:

甩一個鏈接:http://wenku.baidu.com/view/2c0feaa6f524ccbff121841d.html

 

GIF文件結束塊:

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

 

PNG

便攜式網絡圖形(Portable Network Graphics,PNG)是一種無損壓縮的位圖圖形格式,支持索引、灰度、RGB三種顏色方案以及Alpha通道等特性。PNG的開發目標是改善並取代GIF作為適合網絡傳輸的格式而不需專利許可,所以被廣泛應用於互聯網及其他方面上。

PNG另一個非正式的名稱來源為遞歸縮寫:“PNG is Not GIF”。

 

特點:

支持256色調色板技術以產生小體積文件

最高支持48位真彩色圖像以及16位灰度圖像。

支持Alpha通道的透明/半透明特性。

支持圖像亮度的Gamma校准信息。

支持存儲附加文本信息,以保留圖像名稱、作者、版權、創作時間、注釋等信息。

使用無損壓縮。

漸近顯示和流式讀寫,適合在網絡傳輸中快速顯示預覽效果后再展示全貌。

使用CRC防止文件出錯。

最新的PNG標准允許在一個文件內存儲多幅圖像。

 

關於PNG格式,甩一個鏈接 http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm

PNG格式有8位、24位、32位三種形式,其中8位PNG支持兩種不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基礎上增加了8位透明通道,因此可展現256級透明程度。

PNG8和PNG24后面的數字則是代表這種PNG格式最多可以索引和存儲的顏色值。”8″代表2的8次方也就是256色,而24則代表2的24次方大概有1600多萬色。

格式

最高支持色彩通道

索引色編輯支持

透明支持

PNG8

256索引色

支持

支持設定特定索引色為透明色(布爾透明)

支持為索引色附加8位透明度(256階alpha透明)

PNG24

約1600萬色

不支持

不支持

PNG32

約1600萬色

不支持

支持8位透明度(256階alpha透明)

 

PNG圖像格式文件由一個8字節的PNG文件標識(file signature)域和3個以上的后續數據塊(chunk)組成。

甩一個鏈接:http://baike.baidu.com/view/5342.htm?fr=aladdin#3

 

PNG文件包括8字節文件署名(89 50 4E 47 0D 0A 1A 0A,十六進制),用來識別PNG格式。

十六進制

含義

89

用於檢測傳輸系統是否支持8位的字符編碼(8 bit data),用以減少將文本文件被錯誤的識別成PNG文件的機會,反之亦然。

50 4E 47

PNG每個字母對應的ASCII,讓用戶可以使用文本編輯器查看時,識別出是PNG文件。

0D 0A

DOS風格的換行符(CRLF)。用於DOS-Unix數據的換行符轉換。

1A

在DOS命令行下,用於阻止文件顯示的文件結束符。

0A

Unix風格的換行符(LF)。用於Unix-DOS換行符的轉換。

 

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

每個數據塊都由表6-07所示的的4個域組成:

名稱

字節數  

說明  

Length(長度)

4字節  

指定數據塊中數據域的長度,其長度不超過

(231-1)字節

Chunk Type Code(數據塊類型碼)

4字節

數據塊類型碼由ASCII字母(A-Z和a-z)組成

Chunk Data(數據塊數據)

可變長度

存儲按照Chunk Type Code指定的數據

CRC(循環冗余檢測)

4字節

存儲用來檢測是否有錯誤的循環冗余碼

長度.

一個4字節的無符號整數,給出字節的數據塊的數據字段的數量。 長度計算數據字段,為了兼容一些不支持無符號的語言,所以不是(2^32-1)。

數據塊類型碼.

一個4字節的塊類型代碼。 為了便於描述和檢查PNG文件,類型代碼僅限於包括大寫和小寫的ASCII字母(A - Z和a - z或65-90和97-122十進制)。 然而,編碼器和解碼器必須把代碼作為固定的二進制值,而不是字符串。

數據塊.

數據塊的數據字節,以適當的組塊的類型,如果有的話。 該字段可以是長度為零。

循環冗余檢測.

一個4字節的CRC(循環冗余校驗)計算,在所述塊的前面的字節,包括該塊類型的代碼和數據塊的數據字段,但是包括長度字段。 CRC是始終存在,甚至不包含數據塊。

 

IEND

圖像結束數據IEND(image trailer chunk):它用來標記PNG文件或者數據流已經結束,並且必須要放在文件的尾部。

如果我們仔細觀察PNG文件,我們會發現,文件的結尾12個字符看起來總應該是這樣的:

00 00 00 00 49 45 4E 44 AE 42 60 82

不難明白,由於數據塊結構的定義,IEND數據塊的長度總是0(00 00 00 00,除非人為加入信息),數據標識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM