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

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  }

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值