BOOL CDib::Read(CFile* pFile)
2011-01-21 11:34:37| 分类:
VC++
| 标签:
|举报
|字号大中小 订阅
BOOL CDib::Read(CFile* pFile)
{
// 1. read file header to get size of info hdr + color table
// 2. read info hdr (to get image size) and color table
// 3. read image
// can't use bfSize in file header
// 清除DIB
Empty();
int nCount, nSize;
BITMAPFILEHEADER bmfh;//位图文件头结构,定义了一个对象
// 尝试读取BMP文件
try
{
// 读BMP文件头
nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));//位图文件头存放在位图文件的开头部分,具体为什么可以研究位图文件的相关内容。
// 判断读取文件头的大小是否正确
if(nCount != sizeof(BITMAPFILEHEADER))
{
// 读文件出错
throw new CException;
}
// 判断是否是"BM"
if(bmfh.bfType != 0x4d42)//位图文件头结构体的一个字段,只要是位图文件,这个值始终是“BM”
{
// 不是BMP文件,抛出异常
throw new CException;
}
nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
m_nBmihAlloc = m_nImageAlloc = crtAlloc;
nCount = pFile->Read(m_lpBMIH, nSize); // info hdr & color table
ComputeMetrics();//compute:计算;Metrics:尺寸
ComputePaletteSize(m_lpBMIH->biBitCount);
MakePalette();
m_lpImage = (LPBYTE) new char[m_dwSizeImage];
nCount = pFile->Read(m_lpImage, m_dwSizeImage); // image only
}
catch(CException* pe)
{
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
return TRUE;
}
评论这张
转发至微博
转发至微博
评论