请问如何用cbitmap类在内存里,画一个图形,然后将该图形存成bmp文件

解决方案 »

  1.   

    http://www.codeproject.com/bitmap/bitmapdc.asp
    CBitmapDC - An automatic memory DC wrapper
      

  2.   

    void savebmp(CBitmap& bmp)
    {
    CPictureHolder picture;
    picture.CreateFromBitmap((HBITMAP)bmp, NULL, TRUE);
    LPPICTUREDISP pPictureDisp=picture.GetPictureDispatch();
    pPictureDisp->Release(); // must be released
    IStorage* pStg = 0;        hr = ::StgCreateDocfile(L"c:\\picttest",
                  STGM_SHARE_EXCLUSIVE |
                  STGM_CREATE |
                  STGM_READWRITE,
                  0, &pStg);
            if(SUCCEEDED(hr))
            {
                IStream* pStream = 0;            hr = pStg->CreateStream(L"PICTURE",
                      STGM_SHARE_EXCLUSIVE |
                      STGM_CREATE |
                      STGM_READWRITE,
                      0, 0, &pStream);
                if(SUCCEEDED(hr))
                {
                    hr = pPictureDisp->SaveAsFile(pStream,
                          TRUE, // save mem copy
                          NULL);
                    pStream->Release();
                }
                pStg->Release();
            }
            pPictureDisp->Release();
    }
      

  3.   

    画图形的代码
    CRect rt;
    GetClientRect(rt);
    CBitmap bitmap;
    CBitmap* pOldbitmap;
    CDC MemDC;
    MemDC.CreateCompatibleDC(pDC);
    bitmap.LoadBitmap(IDB_WORKSPACE);
    pOldbitmap = MemDC.SelectObject(&bitmap);
    pDC->BitBlt(50,50,rt.Width()-10,rt.Height()-10,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldbitmap);
    MemDC.DeleteDC();
      

  4.   

    画图形的代码
    CRect rt;
    GetClientRect(rt);
    CBitmap bitmap;
    CBitmap* pOldbitmap;
    CDC MemDC;
    MemDC.CreateCompatibleDC(pDC);
    bitmap.LoadBitmap(IDB_WORKSPACE);
    pOldbitmap = MemDC.SelectObject(&bitmap);
    pDC->BitBlt(50,50,rt.Width()-10,rt.Height()-10,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldbitmap);
    MemDC.DeleteDC();
      

  5.   

    存图形的代码
    CBitmap bitmap;
    HANDLE h=::LoadImage(0,"f:\\aaa.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    bitmap.Attach(h);——————————————————————————
    CFile file("F:\\aaa1.bmp",CFile::modeCreate|CFile::modeWrite);
    CArchive ar(&file,CArchive::store); BITMAP size;
    bitmap.GetBitmap(&size);
    int iHeight=size.bmHeight;
    int iWidth=size.bmWidth;
    int WIDTHBYTES;
    unsigned char * pBitBuf=NULL; WIDTHBYTES=(iWidth*3+3)/4*4;
    pBitBuf=(unsigned char *)malloc(WIDTHBYTES*iHeight); BITMAPFILEHEADER BitFileHead;
    BITMAPINFOHEADER BitInfoHead;
    BitInfoHead.biHeight=iHeight;
    BitInfoHead.biWidth=iWidth;
    BitInfoHead.biSizeImage=WIDTHBYTES*iHeight;
    BitInfoHead.biSize          = sizeof(BITMAPINFOHEADER);
    BitInfoHead.biPlanes        = 1;
    BitInfoHead.biBitCount      = 24;
    BitInfoHead.biCompression   = BI_RGB;
    BitInfoHead.biXPelsPerMeter = 2952; // 75 DPI 
    BitInfoHead.biYPelsPerMeter = 2952; // 75 DPI 
    BitInfoHead.biClrUsed       = 0;
    BitInfoHead.biClrImportant  = 0;

    BitFileHead.bfType      = 'MB'; // Non-portable... sigh 
    BitFileHead.bfSize      = BitInfoHead.biSizeImage+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    BitFileHead.bfReserved1 = 0;
    BitFileHead.bfReserved2 = 0;
    BitFileHead.bfOffBits   =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); BITMAPINFO mapinfo;
    mapinfo.bmiHeader=BitInfoHead;
    // mapinfo.bmiColors HDC hdc = CreateIC (TEXT("DISPLAY"), NULL, NULL, NULL) ;
    ::GetDIBits (hdc, (HBITMAP)h,0, iHeight, pBitBuf, &mapinfo, DIB_RGB_COLORS) ;
    file.Write(&BitFileHead,sizeof(BITMAPFILEHEADER));
    file.Write(&BitInfoHead,sizeof(BITMAPINFOHEADER));
    file.Write(pBitBuf,WIDTHBYTES*iHeight); free(pBitBuf);

    ar.Close();
    file.Close();
    bitmap.DeleteObject();
      

  6.   

    这里有个例子程序,是从界面DC保存图像到bmp文件,把界面dc换成内存dc就可以了
    http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=82&show=0
      

  7.   

    保存一个文件要这么多啊!
    GDI 完全不熟:(