[VC]怎么样把CDC上的一个图保存为bmp格式的图

转载 2006年06月15日 14:42:00

001  HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
002  {
003      HDC hBufDC;
004      HBITMAP hBitmap, hBitTemp;
005      //创建设备上下文(HDC)
006      hBufDC = CreateCompatibleDC(hDC);
007      //创建HBITMAP
008      hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
009      hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);
010      //得到位图缓冲区
011      StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
012      //得到最终的位图信息
013      hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);
014      //释放内存
015      DeleteObject(hBitTemp);
016      ::DeleteDC(hBufDC);
017      return hBitmap;
018  }
019  BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
020  {
021      //设备描述表
022      HDC hDC;
023      //当前分辨率下每象素所占字节数
024      int iBits;
025      //位图中每象素所占字节数
026      WORD wBitCount;
027      //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
028      DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
029      //位图属性结构 
030      BITMAP Bitmap; 
031      //位图文件头结构
032      BITMAPFILEHEADER bmfHdr; 
033      //位图信息头结构 
034      BITMAPINFOHEADER bi; 
035      //指向位图信息头结构 
036      LPBITMAPINFOHEADER lpbi; 
037      //定义文件,分配内存句柄,调色板句柄 
038      HANDLE fh, hDib, hPal,hOldPal=NULL; 
039      //计算位图文件每个像素所占字节数 
040      hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
041      iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
042      DeleteDC(hDC); 
043      if (iBits <= 1) wBitCount = 1; 
044      else if (iBits <= 4) wBitCount = 4; 
045      else if (iBits <= 8) wBitCount = 8; 
046      else wBitCount = 24; 
047      GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
048      bi.biSize = sizeof(BITMAPINFOHEADER);
049
      bi.biWidth = Bitmap.bmWidth;
050      bi.biHeight = Bitmap.bmHeight;
051      bi.biPlanes = 1;
052      bi.biBitCount = wBitCount;
053      bi.biCompression = BI_RGB;
054      bi.biSizeImage = 0;
055      bi.biXPelsPerMeter = 0;
056      bi.biYPelsPerMeter = 0;
057      bi.biClrImportant = 0;
058      bi.biClrUsed = 0;
059      dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
060      //为位图内容分配内存 
061      hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
062      lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
063      *lpbi = bi; 
064      // 处理调色板 
065      hPal = GetStockObject(DEFAULT_PALETTE); 
066      if (hPal) 
067      { 
068          hDC = ::GetDC(NULL); 
069          hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
070          RealizePalette(hDC); 
071      }
072      // 获取该调色板下新的像素值 
073      GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
074          +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); 
075      //恢复调色板 
076      if (hOldPal) 
077      { 
078          ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
079          RealizePalette(hDC); 
080          ::ReleaseDC(NULL, hDC); 
081      } 
082      //创建位图文件 
083      fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
084          FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
085      if (fh == INVALID_HANDLE_VALUE) return FALSE
086      // 设置位图文件头 
087      bmfHdr.bfType = 0x4D42; // "BM" 
088      dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; 
089      bmfHdr.bfSize = dwDIBSize;
090      bmfHdr.bfReserved1 = 0; 
091      bmfHdr.bfReserved2 = 0;
092      bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
093      
094      // 写入位图文件头
095      WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
096      // 写入位图文件其余内容 
097      // WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 
098      GlobalUnlock(hDib); 
099      GlobalFree(hDib); 
100      CloseHandle(fh); 
101      return TRUE;
102  }

怎么样把CDC上的一个图保存为bmp格式的图

1  HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight) 002  { 003      HDC hBufDC; 004    ...
  • Sayesan
  • Sayesan
  • 2015年06月02日 16:36
  • 523

怎么样把CDC上的一个图保存为bmp格式的图

001  HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight) 002  { 003      HDC hBufDC; 004  ...

把CD上的一个图保存为bmp格式的图

// CReadWriteBmpView message handlers HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight) {...

VC屏幕截图,保存为Bmp文件

新建一个MFC基于对话框的应用程序,在界面上放一个Button,为其实现点击事件,代码如下: void CScreenShotDlg::OnBtnScreenshot() { RECT rect ...

VC屏幕截图并保存为bmp文件

保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how...

VC屏幕截图并保存为bmp文件

保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how...
  • masikkk
  • masikkk
  • 2012年06月13日 15:14
  • 2295

vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片

刚开始使用的是gdi保存cview中的绘图内容,但是发现由于保存的是位图所以保存下来的图片的大小很大,每个大概有2M左右,所以在网上找解决方法,选择使用GDI+来保存绘图为图片,大小为20K左右,主要...

vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片

刚开始使用的是gdi保存cview中的绘图内容,但是发现由于保存的是位图所以保存下来的图片的大小很大,每个大概有2M左右,所以在网上找解决方法,选择使用GDI+来保存绘图为图片,大小为20K左右,主要...
  • zhha86
  • zhha86
  • 2011年11月28日 11:00
  • 4193

GDI将CDC中的位图保持bmp格式文件,解决GetDIBits调用出错的情况

/// /// 保存图像 /// /// 路径 /// 图片 /// CDC void vOrientMap::SaveBmpFile(const char* pPath,CBitmap& bit...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[VC]怎么样把CDC上的一个图保存为bmp格式的图
举报原因:
原因补充:

(最多只允许输入30个字)