電子相冊之bitmap

位圖文件主要分爲3部分:1. 文件信息頭     14Bytewindows

                                          2. 位圖信息頭     40Bytespa

                                          3. RGB顏色陣列   由圖像長寬尺寸決定orm

1. 文件信息頭索引

定義結構體:it

typedef struct tagBITMAPFILEHEADER { /* bmfh */io

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;
相關文章
相關標籤/搜索