BMP檔案的資料按照從檔案頭開始的先後順序分為四個部分:
◆ 點陣圖檔案頭(bmp file header): 提供檔案的格式、大小等資訊
◆ 點陣圖資訊頭(bitmap information):提供影象資料的尺寸、位平面數、壓縮方式、顏色索引等資訊
◆ 調色盤(color palette):可選,如使用索引來表示影象,調色盤就是索引與其對應的顏色的對映表
◆ 點陣圖資料(bitmap data):影象資料區
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資訊頭結構體定義如下:
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調色盤結構體定義如下:
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。
BMP檔案的資料按照從檔案頭開始的先後順序分為四個部分:
◆ 點陣圖檔案頭(bmp file header): 提供檔案的格式、大小等資訊
◆ 點陣圖資訊頭(bitmap information):提供影象資料的尺寸、位平面數、壓縮方式、顏色索引等資訊
◆ 調色盤(color palette):可選,如使用索引來表示影象,調色盤就是索引與其對應的顏色的對映表
◆ 點陣圖資料(bitmap data):影象資料區
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資訊頭結構體定義如下:
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調色盤結構體定義如下:
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。