BMP圖像數據格式詳解


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


免責聲明!

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



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