點陣圖文件主要分為3部分:1. 文件信息頭 14Byte 2. 點陣圖信息頭 40Byte 3. RGB顏色陣列 由圖像長寬尺寸決定 1. 文件信息頭 定義結構體: typedef struct tagBITMAPFILEHEADER { /* bmfh */ UINT bfType; DWORD bf ...
點陣圖文件主要分為3部分:1. 文件信息頭 14Byte
2. 點陣圖信息頭 40Byte
3. RGB顏色陣列 由圖像長寬尺寸決定
1. 文件信息頭
定義結構體:
typedef struct tagBITMAPFILEHEADER { /* bmfh */
UINT bfType;DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits; } BITMAPFILEHEADER; bfType:必須是0x4D42 bfSize: 點陣圖文件的大小 bfReserved1:保留成員1,必須為0 bfReserved2:保留成員2,必須為0 bfOffBits:從文件頭開始到實際的點陣圖數據之間的偏移量 2. 點陣圖信息頭 定義結構體: typedef struct tagBITMAPINFOHEADER { /* bmih */ DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant; } BITMAPINFOHEADER; biSize:結構體大小,以字為單位(4位元組),4位元組對齊 biWidth: 圖像寬度,以像素為單位 biHeight:圖像高度,以像素為單位。大於0,圖像是倒向的;小於0,圖像是正向的。大多數為倒向的。就是說圖像數據是從圖像的左下腳的像素開始一行一行的存儲的。 biPlanes:總是為1 biBitCount:每像素所占的比特數(位數),一般為24或32位 biCompression:圖像數據壓縮類型,討論沒有壓縮的類型:BI_RGB biSizeImage:說明圖像的大小,以位元組為單位。為BI_RGB類型時可以設置為0 biXPelsPerMeter:水平解析度,以像素/米表示 biYPelsPerMeter:垂直解析度,以像素/米表示 biClrUsed:說明點陣圖實際使用的調色板中的索引數,為0就是使用所有的索引數 biClrImportant:說明對圖像顯示有重要影響的索引數,為0就是都重要 3. RGB顏色陣列 windows下RGB顏色陣列實際上是以BGR格式來存儲的,24位就是從高位到低位每個位元組存儲的顏色數據依次是BGR,32位的RGB點陣圖從高位到低位依次是BGR以及最低一個位元組點陣圖像透明度 4. 載入文件頭 //Load the file header BITMAPFILEHEADER header; memset(&header, 0, sizeof(header)); inf.read((char*)&header, sizeof(header)); if(header.bfType != 0x4D42) return false; 5. 載入點陣圖信息 //Load the image information header BITMAPINFOHEADER infoheader; memset(&infoheader, 0, sizeof(infoheader)); inf.read((char*)&infoheader, sizeof(infoheader)); m_iImageWidth = infoheader.biWidth; m_iImageHeight = infoheader.biHeight; m_iBitsPerPixel = infoheader.biBitCount; 6. 行對齊 載入得到的點陣圖信息的每個像素是4位元組對齊的,如果圖像的像素不是4位元組對齊,會自動在位後面補零,湊成4位元組對齊。 這樣圖像數據的長度就是: //Calculate the image data size int iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2; m_iImageDataSize = iLineByteCnt * m_iImageHeight;