BMP文件結構詳解 收藏新一篇: 位圖資料 | 舊一篇: 位圖資料1. BMP文件組成BMP文件由文件頭,、位圖信息頭,、顏色信息和圖形數(shù)據(jù)四部分組成。 2. BMP文件頭 BMP文件頭數(shù)據(jù)結構含有BMP文件的類型,、文件大小和位圖起始位置等信息,。 其結構定義如下: typedef struct tagBITMAPFILEHEADER { WORDbfType; // 位圖文件的類型,必須為BM DWORD bfSize; // 位圖文件的大小,,以字節(jié)為單位 WORDbfReserved1; // 位圖文件保留字,,必須為0 WORDbfReserved2; // 位圖文件保留字,必須為0 DWORD bfOffBits; // 位圖數(shù)據(jù)的起始位置,,以相對于位圖 // 文件頭的偏移量表示,,以字節(jié)為單位 } BITMAPFILEHEADER; 3. 位圖信息頭 BMP位圖信息頭數(shù)據(jù)用于說明位圖的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本結構所占用字節(jié)數(shù) LONGbiWidth; // 位圖的寬度,,以像素為單位 LONGbiHeight; // 位圖的高度,,以像素為單位 WORD biPlanes; // 目標設備的級別,,必須為1 WORD biBitCount// 每個像素所需的位數(shù),必須是1(雙色), // 4(16色),,8(256色)或24(真彩色)之一 DWORD biCompression; // 位圖壓縮類型,,必須是 0(不壓縮), // 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一 DWORD biSizeImage; // 位圖的大小,以字節(jié)為單位 LONGbiXPelsPerMeter; // 位圖水平分辨率,,每米像素數(shù) LONGbiYPelsPerMeter; // 位圖垂直分辨率,,每米像素數(shù) DWORD biClrUsed;// 位圖實際使用的顏色表中的顏色數(shù) DWORD biClrImportant;// 位圖顯示過程中重要的顏色數(shù) } BITMAPINFOHEADER; 4. 顏色表 顏色表用于說明位圖中的顏色,它有若干個表項,,每一個表項是一個RGBQUAD類型的結構,,定義一種顏色。RGBQUAD結構的定義如下: typedef struct tagRGBQUAD { BYTErgbBlue;// 藍色的亮度(值范圍為0-255) BYTErgbGreen; // 綠色的亮度(值范圍為0-255) BYTErgbRed; // 紅色的亮度(值范圍為0-255) BYTErgbReserved;// 保留,,必須為0 } RGBQUAD; 顏色表中RGBQUAD結構數(shù)據(jù)的個數(shù)有biBitCount來確定: 當biBitCount=1,4,8時,,分別有2,16,256個表項; 當biBitCount=24時,沒有顏色表項,。 位圖信息頭和顏色表組成位圖信息,,BITMAPINFO結構定義如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位圖信息頭 RGBQUAD bmiColors[1]; // 顏色表 } BITMAPINFO; 5. 位圖數(shù)據(jù) 位圖數(shù)據(jù)記錄了位圖的每一個像素值,記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上,。位圖的一個像素值所占的字節(jié)數(shù): 當biBitCount=1時,,8個像素占1個字節(jié); 當biBitCount=4時,2個像素占1個字節(jié); 當biBitCount=8時,,1個像素占1個字節(jié); 當biBitCount=24時,1個像素占3個字節(jié); Windows規(guī)定一個掃描行所占的字節(jié)數(shù)必須是 4的倍數(shù)(即以long為單位),不足的以0填充,, 一個掃描行所占的字節(jié)數(shù)計算方法: DataSizePerLine= (biWidth* biBitCount+31)/8; // 一個掃描行所占的字節(jié)數(shù) DataSizePerLine= DataSizePerLine/4*4; // 字節(jié)數(shù)必須是4的倍數(shù) 位圖數(shù)據(jù)的大小(不壓縮情況下): DataSize= DataSizePerLine* biHeight; Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1516523 |
|