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

来源:互联网 发布:博客发帖软件 编辑:程序博客网 时间:2024/05/16 15:37

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  }

 

 

参考资料:

http://blog.csdn.net/zhaoxiafei/archive/2006/06/15/799822.aspx