[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格式的图

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

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

1  HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight) 002  { 003     &...

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

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

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

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

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

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

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

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

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

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

win32ASM截图保存为BMP

1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)

源代码:http://download.csdn.net/detail/nuptboyzhb/3961677 Ø  添加全屏截图菜单项,菜单项的属性如下; Ø  为该菜单项建立类向导。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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