BOOL CDib::Read(CFile* pFile)


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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值