天天看點

BMP圖像資料格式詳解

一.簡介

二.BMP格式結構

BMP檔案的資料按照從檔案頭開始的先後順序分為四個部分:

◆ 位圖檔案頭(bmp file header):  提供檔案的格式、大小等資訊

◆ 位圖資訊頭(bitmap information):提供圖像資料的尺寸、位平面數、壓縮方式、顔色索引等資訊

◆ 調色闆(color palette):可選,如使用索引來表示圖像,調色闆就是索引與其對應的顔色的映射表

◆ 位圖資料(bitmap data):圖像資料區

BMP圖檔檔案資料表如下:

資料段名稱

大小(byte)

開始位址

結束位址

位圖檔案頭(bitmap-file header)

14

0000h

000Dh

位圖資訊頭(bitmap-information header)

40

000Eh

0035h

調色闆(color table)

由biBitCount決定

0036h

未知

圖檔點陣資料(bitmap data)

由圖檔大小和顔色定

三.BMP檔案頭

BMP檔案頭結構體定義如下:

typedef struct tagBITMAPFILEHEADER

UINT16 bfType;        //2Bytes,必須為"BM",即0x424D 才是Windows位圖檔案

DWORD bfSize;         //4Bytes,整個BMP檔案的大小

UINT16 bfReserved1;  //2Bytes,保留,為0

UINT16 bfReserved2;  //2Bytes,保留,為0

DWORD bfOffBits;     //4Bytes,檔案起始位置到圖像像素資料的位元組偏移量

} BITMAPFILEHEADER;

BMP檔案頭資料表如下:

變量名

位址偏移

大小

作用說明

bfType

2Bytes

檔案辨別符,必須為"BM",即0x424D 才是Windows位圖檔案

‘BM’:Windows 3.1x, 95, NT,…  ‘BA’:OS/2 Bitmap Array  ‘CI’:OS/2 Color Icon   

‘CP’:OS/2 Color Pointer   ‘IC’:OS/2 Icon   

‘PT’:OS/2 Pointer

因為OS/2系統并沒有被普及開,是以在程式設計時,你隻需判斷第一個辨別“BM”就行

bfSize

0002h

4Bytes

整個BMP檔案的大小(以位B為機關)

bfReserved1

0006h

保留,必須設定為0

bfReserved2

0008h

bfOffBits

000Ah

說明從檔案頭0000h開始到圖像像素資料的位元組偏移量(以位元組Bytes為機關),以為位圖的調色闆長度根據位圖格式不同而變化,可以用這個偏移量快速從檔案中讀取圖像資料

四.BMP資訊頭

BMP資訊頭結構體定義如下:

typedef struct _tagBMP_INFOHEADER

{

DWORD  biSize;    //4Bytes,INFOHEADER結構體大小,存在其他版本I NFOHEADER,用作區分

LONG   biWidth;    //4Bytes,圖像寬度(以像素為機關)

LONG   biHeight;    //4Bytes,圖像高度,+:圖像存儲順序為Bottom2Top,-:Top2Bottom

WORD   biPlanes;    //2Bytes,圖像資料平面,BMP存儲RGB資料,是以總為1

WORD   biBitCount;         //2Bytes,圖像像素位數

DWORD  biCompression;     //4Bytes,0:不壓縮,1:RLE8,2:RLE4

DWORD  biSizeImage;       //4Bytes,4位元組對齊的圖像資料大小

LONG   biXPelsPerMeter;   //4 Bytes,用象素/米表示的水準分辨率

LONG   biYPelsPerMeter;   //4 Bytes,用象素/米表示的垂直分辨率

DWORD  biClrUsed;          //4 Bytes,實際使用的調色闆索引數,0:使用所有的調色闆索引

DWORD biClrImportant;     //4 Bytes,重要的調色闆索引數,0:所有的調色闆索引都重要

}BMP_INFOHEADER;

BMP資訊頭資料表如下:

biSize

BNP資訊頭即BMP_INFOHEADER結構體所需要的位元組數(以位元組為機關)

biWidth

0012h

說明圖像的寬度(以像素為機關)

biHeight

0016h

說明圖像的高度(以像素為機關)。這個值還有一個用處,指明圖像是正向的位圖還是倒向的位圖,該值是正數說明圖像是倒向的即圖像存儲是由下到上;該值是負數說明圖像是倒向的即圖像存儲是由上到下。大多數BMP位圖是倒向的位圖,是以此值是正值。

biPlanes

001Ah

為目标裝置說明位面數,其值總設定為1

biBitCount

001Ch

說明一個像素點占幾位(以比特位/像素位機關),其值可為1,4,8,16,24或32

biCompression

001Eh

說明圖像資料的壓縮類型,取值範圍為:

0         BI_RGB 不壓縮(最常用)

1         BI_RLE8 8比特遊程編碼(BLE),隻用于8位位圖

2         BI_RLE4 4比特遊程編碼(BLE),隻用于4位位圖

3         BI_BITFIELDS比特域(BLE),隻用于16/32位位圖

4          

biSizeImage

0022h

說明圖像的大小,以位元組為機關。當用BI_RGB格式時,總設定為0

biXPelsPerMeter

0026h

說明水準分辨率,用像素/米表示,有符号整數

biYPelsPerMeter

002Ah

說明垂直分辨率,用像素/米表示,有符号整數

biClrUsed

002Eh

說明位圖實際使用的調色闆索引數,0:使用所有的調色闆索引

biClrImportant

0032h

說明對圖像顯示有重要影響的顔色索引的數目,如果是0,表示都重要。

五.BMP調色闆

BMP調色闆結構體定義如下:

typedef struct _tagRGBQUAD

BYTE  rgbBlue;       //指定藍色強度

BYTE  rgbGreen;      //指定綠色強度

BYTE  rgbRed;        //指定紅色強度

 BYTE  rgbReserved;  //保留,設定為0

} RGBQUAD;

1,4,8位圖像才會使用調色闆資料,16,24,32位圖像不需要調色闆資料,即調色闆最多隻需要256項(索引0 - 255)。

顔色表的大小根據所使用的顔色模式而定:2色圖像為8位元組;16色圖像位64位元組;256色圖像為1024位元組。其中,每4位元組表示一種顔色,并以B(藍色)、G(綠色)、R(紅色)、alpha(32位位圖的透明度值,一般不需要)。即首先4位元組表示顔色号1的顔色,接下來表示顔色号2的顔色,依此類推。

顔色表中RGBQUAD結構資料的個數有biBitCount來确定,當biBitCount=1,4,8時,分别有2,16,256個表項。

當biBitCount=1時,為2色圖像,BMP位圖中有2個資料結構RGBQUAD,一個調色闆占用4位元組資料,是以2色圖像的調色闆長度為2*4為8位元組。

當biBitCount=4時,為16色圖像,BMP位圖中有16個資料結構RGBQUAD,一個調色闆占用4位元組資料,是以16像的調色闆長度為16*4為64位元組。

當biBitCount=8時,為256色圖像,BMP位圖中有256個資料結構RGBQUAD,一個調色闆占用4位元組資料,是以256色圖像的調色闆長度為256*4為1024位元組。

當biBitCount=16,24或32時,沒有顔色表。

五.BMP圖像資料區

位圖資料記錄了位圖的每一個像素值,記錄順序是在掃描行内是從左到右,掃描行之間是從下到上。位圖的一個像素值所占的位元組數:

當biBitCount=1時,8個像素占1個位元組;

當biBitCount=4時,2個像素占1個位元組;

當biBitCount=8時,1個像素占1個位元組;

當biBitCount=24時,1個像素占3個位元組;

Windows規定一個掃描行所占的位元組數必須是4的倍數(即以long為機關),不足的以0填充,

一個掃描行所占的位元組數計算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;

// 一個掃描行所占的位元組數

DataSizePerLine= DataSizePerLine/4*4; // 位元組數必須是4的倍數

位圖資料的大小(不壓縮情況下):

DataSize= DataSizePerLine* biHeight;

顔色表接下來位為位圖檔案的圖像資料區,在此部分記錄着每點像素對應的顔色号,其記錄方式也随顔色模式而定,既2色圖像每點占1位(8位為1位元組);16色圖像每點占4位(半位元組);256色圖像每點占8位(1位元組);真彩色圖像每點占24位(3位元組)。是以,整個資料區的大小也會随之變化。究其規律而言,可的出如下計算公式:圖像資料資訊大小=(圖像寬度*圖像高度*記錄像素的位數)/8。

相關閱讀:

<a target="_blank" href="http://blog.csdn.net/testcs_dn/article/details/76744048">Device-Dependent Bitmaps (DDB) 裝置相關位圖</a>

<a target="_blank" href="http://blog.csdn.net/testcs_dn/article/details/76718768">device-independent bitmap (DIB) 裝置無關位圖</a>

繼續閱讀