第一步,你必須知道位圖即BMP格式的文件的結(jié)構(gòu).
位圖(bmp)文件由以下幾個(gè)部分組成:
1.BITMAPFILEHEADER,它的定義如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //必須為’BM’
DWORD bfSize; //文件大小
WORD bfReserved1; //必須為0
WORD bfReserved2; //必須為0
DWORD bfOffBits; //從ITMAPFILEHEADER到存放bmp數(shù)據(jù)的偏移量
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
2.BITMAPINFOHEADER,它的定義如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //此結(jié)構(gòu)的大小,可用sizeof(BITMAPINFOHEAER)得到
LONG biWidth; //位圖寬度,以象素為單位
LONG biHeight; //位圖高度,以象素為單位
WORD biPlanes; //必須為1
WORD biBitCount;//位圖象素位數(shù),可為0,1,4,8,24,32
DWORD biCompression;
DWORD biSizeImage; //(僅用于壓縮)
LONG biXPelsPerMeter; //一米橫向象素?cái)?shù)
LONG biYPelsPerMeter; //一米縱向象素?cái)?shù)
DWORD biClrUsed;// (非零用語(yǔ)短顏色表)
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
由于以上信息可以直接從MSDN上查到,所以只做簡(jiǎn)單介紹,你可以自己查看NSDN幫助,上面有很詳細(xì)的介紹.
3.DIB位圖像.這里放的是真正的位圖數(shù)據(jù).
知道了位圖的存放格式,下面我們就可以很容易的把它讀如內(nèi)存.
第二步,讀入bmp圖像
LPCTSTR lpszFileName4="untitled.bmp"; //文件路徑
CFile file; //用于讀取BMP文件
BITMAPFILEHEADER bfhHeader;//bmp文件頭
BITMAPINFOHEADER bmiHeader; //bmp格式頭
LPBITMAPINFO lpBitmapInfo; //bmp格式具體信息
int bmpWidth=0; //圖片寬度
int bmpHeight = 0; //圖片高度
if(!file.Open(lpszFileName,CFile::modeRead))
return ; //打開文件
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//讀取文件頭
if(bfhHeader.bfType!=((WORD) (’M’<<8)|’B’)) //判斷是否是"BM"
return ;
if(bfhHeader.bfSize!=file.GetLength())
return ;
if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader))
return ;
bmpHeight = bmiHeader.biHeight;//得到高度和寬度
bmpWidth = bmiHeader.biWidth;
file.SeekToBegin();
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen];
file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen);
if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
return ;
DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits;
LPVOID lpSrcBits=new BYTE[dwBitlen]; //將數(shù)據(jù)讀入lpSrcBits數(shù)組
file.ReadHuge(lpSrcBits,dwBitlen);
file.Close(); //關(guān)閉文件
位圖(bmp)文件由以下幾個(gè)部分組成:
1.BITMAPFILEHEADER,它的定義如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //必須為’BM’
DWORD bfSize; //文件大小
WORD bfReserved1; //必須為0
WORD bfReserved2; //必須為0
DWORD bfOffBits; //從ITMAPFILEHEADER到存放bmp數(shù)據(jù)的偏移量
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
2.BITMAPINFOHEADER,它的定義如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //此結(jié)構(gòu)的大小,可用sizeof(BITMAPINFOHEAER)得到
LONG biWidth; //位圖寬度,以象素為單位
LONG biHeight; //位圖高度,以象素為單位
WORD biPlanes; //必須為1
WORD biBitCount;//位圖象素位數(shù),可為0,1,4,8,24,32
DWORD biCompression;
DWORD biSizeImage; //(僅用于壓縮)
LONG biXPelsPerMeter; //一米橫向象素?cái)?shù)
LONG biYPelsPerMeter; //一米縱向象素?cái)?shù)
DWORD biClrUsed;// (非零用語(yǔ)短顏色表)
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
由于以上信息可以直接從MSDN上查到,所以只做簡(jiǎn)單介紹,你可以自己查看NSDN幫助,上面有很詳細(xì)的介紹.
3.DIB位圖像.這里放的是真正的位圖數(shù)據(jù).
知道了位圖的存放格式,下面我們就可以很容易的把它讀如內(nèi)存.
第二步,讀入bmp圖像
LPCTSTR lpszFileName4="untitled.bmp"; //文件路徑
CFile file; //用于讀取BMP文件
BITMAPFILEHEADER bfhHeader;//bmp文件頭
BITMAPINFOHEADER bmiHeader; //bmp格式頭
LPBITMAPINFO lpBitmapInfo; //bmp格式具體信息
int bmpWidth=0; //圖片寬度
int bmpHeight = 0; //圖片高度
if(!file.Open(lpszFileName,CFile::modeRead))
return ; //打開文件
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//讀取文件頭
if(bfhHeader.bfType!=((WORD) (’M’<<8)|’B’)) //判斷是否是"BM"
return ;
if(bfhHeader.bfSize!=file.GetLength())
return ;
if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader))
return ;
bmpHeight = bmiHeader.biHeight;//得到高度和寬度
bmpWidth = bmiHeader.biWidth;
file.SeekToBegin();
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen];
file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen);
if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
return ;
DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits;
LPVOID lpSrcBits=new BYTE[dwBitlen]; //將數(shù)據(jù)讀入lpSrcBits數(shù)組
file.ReadHuge(lpSrcBits,dwBitlen);
file.Close(); //關(guān)閉文件