我的工程是单文档的,在视图上有幅图像,如何才能保存为Bitmap格式的?
试了好多次就是不成...

解决方案 »

  1.   

    给你一段代码:
    BOOL SaveBmp(HBITMAP hBitmap, CString FileName) 
     {
    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  } 
      

  2.   

     CDC   *pDC;   
     CDIB   *pSRC;   
     pDC=pSRC->BeginPaint(NULL);   
     ..........   
     pSRC->EndPaint();   
     pSRC->Save("c:/a.bmp");
      

  3.   

    TO appleboyecho :如果调用你的接口:
    HBITMAP 参数如何设定才可以保证是当前视图的内容?
      

  4.   

    我是这样写的,
    //
    CClientDC dc(this);
    hdc     = dc.m_hDC;
    hdcMem  = CreateCompatibleDC(hdc);
    hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
    SaveBmp02( hBitMap, _T("E:\\RRR.bmp") );
    return;但是不行,只有一个BMP文件生成了,没有图像
      

  5.   

    http://blog.csdn.net/zzz3265/archive/2007/12/26/1967478.aspx参看函数 SaveWindowToBMP
      

  6.   


    //-------------------------------------------------------------
    // Function      : GetWindowBitmap
    // Description   : Copy a block bitmap from the window
    //                 or screen Specifies location
    // Paratmeters   :
    //-------------------------------------------------------------
    HBITMAP GetWindowBitmap(HWND hwnd, LPRECT lpRect)
    {
    if( !lpRect )
    return NULL; HDC hDC;
    HDC hMemDC;
    HBITMAP hBitmap = NULL;
    HBITMAP hOldBitmap;

    // Get window or screen DC
    if( hwnd == NULL )
    hDC = GetDC(HWND_DESKTOP);
    else
    hDC = GetWindowDC(hwnd); if( hDC == NULL )
    return NULL; hMemDC  = CreateCompatibleDC(hDC);
    hBitmap = CreateCompatibleBitmap(hDC, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top);
    if( hBitmap == NULL)
    return NULL; hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    BitBlt(hMemDC, 0, 0, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, hDC, lpRect->left, lpRect->top, SRCCOPY);

    SelectObject(hMemDC, hOldBitmap);
    DeleteDC(hMemDC);
    ReleaseDC(hwnd, hDC); return hBitmap;
    }