一.簡介
BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,在Windows環境下運行的所有圖象處理軟件都支持BMP圖象文件格式。Windows系統內部各圖像繪制操作都是以BMP為基礎的。Windows 3.0以前的BMP圖文件格式與顯示設備有關,因此把這種BMP圖象文件格式稱為設備相關位圖DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP圖象文件與顯示設備無關,因此把這種BMP圖象文件格式稱為設備無關位圖DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系統中仍然存在DDB位圖,象BitBlt()這種函數就是基於DDB位圖的,只不過如果你想將圖像以BMP格式保存到磁盤文件中時,微軟極力推薦你以DIB格式保存),目的是為了讓Windows能夠在任何類型的顯示設備上顯示所存儲的圖象。BMP位圖文件默認的文件擴展名是BMP或者bmp(有時它也會以.DIB或.RLE作擴展名)。
二.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
|
0000h
|
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
|
2Bytes
|
保留,必須設置為0
|
|
bfReserved2
|
0008h
|
2Bytes
|
保留,必須設置為0
|
|
bfOffBits
|
000Ah
|
4Bytes
|
說明從文件頭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
|
000Eh
|
4Bytes
|
BNP信息頭即BMP_INFOHEADER結構體所需要的字節數(以字節為單位)
|
|
biWidth
|
0012h
|
4Bytes
|
說明圖像的寬度(以像素為單位)
|
|
biHeight
|
0016h
|
4Bytes
|
說明圖像的高度(以像素為單位)。這個值還有一個用處,指明圖像是正向的位圖還是倒向的位圖,該值是正數說明圖像是倒向的即圖像存儲是由下到上;該值是負數說明圖像是倒向的即圖像存儲是由上到下。大多數BMP位圖是倒向的位圖,所以此值是正值。
|
|
biPlanes
|
001Ah
|
2Bytes
|
為目標設備說明位面數,其值總設置為1
|
|
biBitCount
|
001Ch
|
2Bytes
|
說明一個像素點占幾位(以比特位/像素位單位),其值可為1,4,8,16,24或32
|
|
biCompression
|
001Eh
|
4Bytes
|
說明圖像數據的壓縮類型,取值范圍為:
0 BI_RGB 不壓縮(最常用)
1 BI_RLE8 8比特游程編碼(BLE),只用於8位位圖
2 BI_RLE4 4比特游程編碼(BLE),只用於4位位圖
3 BI_BITFIELDS比特域(BLE),只用於16/32位位圖
4
|
|
biSizeImage
|
0022h
|
4Bytes
|
說明圖像的大小,以字節為單位。當用BI_RGB格式時,總設置為0
|
|
biXPelsPerMeter
|
0026h
|
4Bytes
|
說明水平分辨率,用像素/米表示,有符號整數
|
|
biYPelsPerMeter
|
002Ah
|
4Bytes
|
說明垂直分辨率,用像素/米表示,有符號整數
|
|
biClrUsed
|
002Eh
|
4Bytes
|
說明位圖實際使用的調色板索引數,0:使用所有的調色板索引
|
|
biClrImportant
|
0032h
|
4Bytes
|
說明對圖像顯示有重要影響的顏色索引的數目,如果是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。
