怎么样把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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值