读取位图文件的步骤
LBITMAPINFO m_pbmInfo;
LPBITMAPINFOHEADER m_pbmInfoHeader;
void LoadBitmapFile(const char* fileName)
{
//打开位图文件
CFile file(fileName,CFile::modeRead);
//将位图文件头读入内存
BITMAPFILEHEADER bmFileHeader;
file.Read((void*)&bmFileHeader,sizeof(bmFileHeader));
//检查是否为位图
if(bmpFileHeader.bfType!=0x4d42)
{
afxMessageBox("not a bitmap file!");
}
else
{
DWORD fileLength=file.GetLength();
DWORD dibSize=fileLength-sizeof(bmFileHeader);// 位图文件的大小减去头文件的大小
//分配全局内存
BYTE* pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,dibSize);
pDib=new BYTE[dibSize];
file.Read(pDib,dibSize);
file.Close();
//初始化指向结构BITMAPINFO和BITMAPINFOHEADER的指针
m_pbmInfo=(LPBITMAPINFO)pDib;
m_pbmInfoHeader=(LPBITMAPINFOHEADER)pDib;
//获得位图的大小
m_pbmInfoHeader->biSizeImage=GetDibSizeImage();//该函数在下面讲解,就是获取像素总和
m_pDibBits=pDib+m_pBmInfoHeader->biSize;//让m_pDibBits指向位图真正的第一位,非位图头。
}
}
DWORD GetDibSizeImage()
{
if(m_pbmInfoHeader->biSizeImage==0)
{
//单行字节数,即宽度
DWORD byteWidth=(DWORD)GetDibWidth();
DWORD height=(DWORD)GetDibHeight();
DWORD imageSize=byteWidht*height;
return imageSize;
}
else
return m_pbmInfoHeader->biSizeImage;
}