位圖文件主要分爲3部分:1. 文件信息頭 14Bytewindows
2. 位圖信息頭 40Bytespa
3. RGB顏色陣列 由圖像長寬尺寸決定orm
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;