使用位图句柄,将其保存为BMP文件


使用位图句柄,将其保存为BMP文件
2011年05月02日
        要通过与设备无关的位图句柄来将位图写入BMP文件,首先要了解BMP文件的结构,BMP文件由3到4个部分组成,第一部分是文件头(BITMAPFILEHEADER),再后面是文件信息头部分(BITMAPINFOHEADER),再往后如果还有的话就是颜色表,颜色表是可以有,也可以没有的,再往后就是图像数据部分了。
  void SaveBmpFile(HBITMAP hBitmap)
  {
  //选择保存路径
  CFileDialog cfd(FALSE,NULL,NULL,6UL,"*.bmp");
  if(cfd.DoModal()==IDOK)
  {
  CString fileName=cfd.GetPathName();
  int nPos = fileName.Find(".");
  if(nPos == -1)
  fileName += ".bmp";
  CFile file(fileName,CFile::modeCreate|CFile::modeWrite);
  //获取位图对象
  CBitmap *pBmp = CBitmap::FromHandle(hBitmap);
  BITMAP bitmap;
  pBmp->GetObject(sizeof(bitmap),&bitmap);
  //设置位图文件头
  BITMAPFILEHEADER bmpHeader;
  BITMAPINFOHEADER bmpInfo;
  DWORD fileSize;
  //获取文件长度
  CDC dc;
  dc.CreateDCA("DISPLAY",NULL,NULL,NULL);
  dc.SelectObject(pBmp);
  //计算
  fileSize = sizeof(bmpHeader) + sizeof(bmpInfo) + bitmap.bmWidth * bitmap.bmHeight * bitmap.bmBitsPixel / 8;
  //设置文件头结构
  ::memset(&bmpHeader,0,sizeof(BITMAPFILEHEADER));
  bmpHeader.bfType = MAKEWORD('B','M');
  bmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  bmpHeader.bfSize = fileSize;
  //设置位图信息头结构
  bmpInfo.biBitCount = bitmap.bmBitsPixel;
  bmpInfo.biCompression = BI_RGB;
  bmpInfo.biPlanes = 1;
  bmpInfo.biWidth = bitmap.bmWidth;
  bmpInfo.biHeight = bitmap.bmHeight;
  bmpInfo.biSize = sizeof(bmpInfo);
  //将位图写入文件
  file.Write(&bmpHeader,sizeof(bmpHeader));
  file.Write(&bmpInfo,sizeof(bmpInfo));
  //写入图像数据部分
  BYTE *pBuffer = new BYTE[fileSize - bmpHeader.bfOffBits];
  ::memset(pBuffer,0,fileSize-bmpHeader.bfOffBits);
  GetDIBits(dc.m_hDC,hBitmap,0,bitmap.bmHeight,pBuffer,(LPBITMAPINFO)&bmpInfo,DIB_RGB_COLORS);    //获取图像数据
  file.Write(pBuffer,fileSize-bmpHeader.bfOffBits);       //写入图像数据
  file.Flush();
  file.Close();
  delete[] pBuffer;
  }
  }

猜你喜欢

转载自zsl702zv.iteye.com/blog/1357719