一.簡介
二.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>