圖像模式識別 (三)

 
BMP文件結構
1. BMP文件組成
BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。
2. BMP文件頭
BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。
其結構定義如下:
typedef struct tagBITMAPFILEHEADER
{
   WORD    bfType;       // 位圖文件的類型,必須爲BM
   DWORD   bfSize;        // 位圖文件的大小,以字節爲單位
   WORD   bfReserved1;    // 位圖文件保留字,必須爲0
   WORD   bfReserved2;    // 位圖文件保留字,必須爲0
   DWORD   bfOffBits;     // 位圖數據的起始位置,以相對於位圖文件
//頭的偏移量表示,以字節爲單位
} BITMAPFILEHEADER;
3. 位圖信息頭
BMP位圖信息頭數據用於說明位圖的尺寸等信息。
typedef struct tagBITMAPINFOHEADER
{
   DWORD    biSize;       // 本結構所佔用字節數
   LONG      biWidth;     // 位圖的寬度,以像素爲單位
   LONG      biHeight;    // 位圖的高度,以像素爲單位
   WORD   biPlanes;      // 目標設備的級別,必須爲1
   WORD    biBitCount     // 每個像素所需的位數,必須是1(雙色),
// 4(16色),8(256色)或24(真彩色)之一
   DWORD  biCompression;   // 位圖壓縮類型,必須是 0(不壓縮),1(BI_RLE8
//壓縮類型)或2(BI_RLE4壓縮類型)之一
   DWORD  biSizeImage; // 位圖的大小,以字節爲單位
   LONG    biXPelsPerMeter; // 位圖水平分辨率,每米像素數
   LONG    biYPelsPerMeter; // 位圖垂直分辨率,每米像素數
   DWORD    biClrUsed;// 位圖實際使用的顏色表中的顏色數
   DWORD    biClrImportant;// 位圖顯示過程中重要的顏色數
} BITMAPINFOHEADER;
4. 顏色表
顏色表用於說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD
{
   BYTE     rgbBlue;   // 藍色的亮度(值範圍爲0-255)
   BYTE     rgbGreen;  // 綠色的亮度(值範圍爲0-255)
   BYTE    rgbRed;    // 紅色的亮度(值範圍爲0-255)
   BYTE   rgbReserved;   // 保留,必須爲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;
(一個掃描行另一種計算方法: DataSizePerLine=(biWidth*biBitCout+31)/32*4)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章