---- 1. BMP文件組成
---- BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。
---- 2. BMP文件頭
---- BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。
---- 其結構定義如下:
typedef struct tagBITMAPFILEHEADER { WORDbfType; // 位圖文件的類型,必須為BM DWORD bfSize; // 位圖文件的大小,以字節為單位 WORDbfReserved1; // 位圖文件保留字,必須為0 WORDbfReserved2; // 位圖文件保留字,必須為0 DWORD bfOffBits; // 位圖數據的起始位置,以相對于位圖 // 文件頭的偏移量表示,以字節為單位 } BITMAPFILEHEADER;
---- 3. 位圖信息頭
BMP位圖信息頭數據用于說明位圖的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本結構所占用字節數 LONGbiWidth; // 位圖的寬度,以像素為單位 LONGbiHeight; // 位圖的高度,以像素為單位 WORD biPlanes; // 目標設備的級別,必須為1 WORD biBitCount// 每個像素所需的位數,必須是1(雙色), // 4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; // 位圖壓縮類型,必須是 0(不壓縮), // 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一 DWORD biSizeImage; // 位圖的大小,以字節為單位 LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素數 LONGbiYPelsPerMeter; // 位圖垂直分辨率,每米像素數 DWORD biClrUsed;// 位圖實際使用的顏色表中的顏色數 DWORD biClrImportant;// 位圖顯示過程中重要的顏色數 } BITMAPINFOHEADER;
---- 4. 顏色表
---- 顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD { BYTErgbBlue;// 藍色的亮度(值范圍為0-255) BYTErgbGreen; // 綠色的亮度(值范圍為0-255) BYTErgbRed; // 紅色的亮度(值范圍為0-255) BYTErgbReserved;// 保留,必須為0 } RGBQUAD; 顏色表中RGBQUAD結構數據的個數有biBitCount來確定: 當biBitCount=1,4,8時,分別有2,16,256個表項; 當biBitCount=24時,沒有顏色表項。 位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位圖信息頭 RGBQUAD bmiColors[1]; // 顏色表 } BITMAPINFO;
---- 5. 位圖數據
---- 位圖數據記錄了位圖的每一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。位圖的一個像素值所占的字節數:
當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;