我在写一个保存时,因为有很多属性,我用的就是
ar << 属性,或ar.WriteObject();
可是CBitmap不行,
有什么简单的方法来保存CBITMAP吗,打开也一样处理。
这个有一个CBitmap m_Bmp;写一个保存打开的例子。

解决方案 »

  1.   

    CBitmap是不能直接保存的,如果保存成文件,需要转化为DIB,然后将数据读出来再写到文件里。或者可以使用图像库,推荐CxImage可以保存成jpg, gif等格式如果你只是读文件的话,建议保存文件路径来保存数据
      

  2.   

    不是这样的,我这个是一个类,有很多属性,要保存这些属性。CBitmap只是其中的一个属性而已。
      

  3.   

    不知道是DIB还是DDB,也不知道调色板信息怎么保存啊?
    光有CBitmap不够
      

  4.   

    你写的是多麻烦的方法呢?CBitmap只是一个类,它并没有包含数据Data,图像信息不在里面的。
      

  5.   

    是呀,一般的BMP打开与保存的方法呀,CDIB这个类就有呀
      

  6.   

    给你一个打开图像文件到HBITMAP和保存HBITMAP成位图文件的代码,改一改你就可以用了!//打开一个图像文件返回位图句柄
    STDMETHODIMP_(HBITMAP) CImage::LoadImageFromFile(IN LPCTSTR lpFileName)
    {
    try
    {
    CFile file;
    if (!file.Open(lpFileName, CFile::modeRead))
    return NULL; // get file size
    DWORD dwFileSize = file.GetLength();
    _ASSERTE(-1 != dwFileSize); LPVOID pvData = NULL;
    // alloc memory based on file size
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    _ASSERTE(NULL != hGlobal); pvData = GlobalLock(hGlobal);
    _ASSERTE(NULL != pvData); // read file and store in global memory
    VERIFY(dwFileSize == file.Read(pvData, dwFileSize));
    GlobalUnlock(hGlobal);
    file.Close(); LPSTREAM pstm = NULL;
    // create IStream* from global memory
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    _ASSERTE(SUCCEEDED(hr) && pstm); // Create IPicture from image file
    LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
    _ASSERTE(SUCCEEDED(hr) && gpPicture);
    pstm->Release();
    if (FAILED(hr) || gpPicture == NULL)
    return NULL; OLE_HANDLE m_picHandle; gpPicture->get_Handle(&m_picHandle);
    return (HBITMAP)m_picHandle;
    }
    catch (CException* pExp)
    {
    TCHAR szErr[200];
    pExp->GetErrorMessage(szErr, 200);
    AfxMessageBox(szErr);
    pExp->Delete();
    } return NULL;
    }//从hBitmap中保存一个位图到lpFileName指定的文件中
    STDMETHODIMP CImage::SaveImageToFile(IN LPCTSTR lpFileName, IN HBITMAP hBitmap)
    {
    //设备描述表
    HDC hDC;
    //当前分辨率下每象素所占字节数
    int iBits;
    //位图中每象素所占字节数
    WORD wBitCount;
    //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
    DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
    //位图属性结构 
    BITMAP Bitmap;  
    //位图文件头结构
    BITMAPFILEHEADER bmfHdr;  
    //位图信息头结构 
    BITMAPINFOHEADER bi;  
    //指向位图信息头结构  
    LPBITMAPINFOHEADER lpbi;  
    //定义文件,分配内存句柄,调色板句柄 
    HANDLE fh, hDib, hPal,hOldPal=NULL; 

    //计算位图文件每个像素所占字节数 
    hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
    DeleteDC(hDC); 
    if (iBits <= 1) wBitCount = 1; 
    else if (iBits <= 4)  wBitCount = 4; 
    else if (iBits <= 8)  wBitCount = 8; 
    else   wBitCount = 24; 

    GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = Bitmap.bmWidth;
    bi.biHeight = Bitmap.bmHeight;
    bi.biPlanes = 1;
    bi.biBitCount = wBitCount;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrImportant = 0;
    bi.biClrUsed = 0;

    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

    //为位图内容分配内存 
    hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
    *lpbi = bi; 

    // 处理调色板  
    hPal = GetStockObject(DEFAULT_PALETTE); 
    if (hPal) 

    hDC = ::GetDC(NULL); 
    hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
    RealizePalette(hDC); 
    }

    // 获取该调色板下新的像素值 
    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
    +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); 

    //恢复调色板  
    if (hOldPal) 

    ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
    RealizePalette(hDC); 
    ::ReleaseDC(NULL, hDC); 


    //创建位图文件  
    fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

    if (fh == INVALID_HANDLE_VALUE)  return FALSE; 

    // 设置位图文件头 
    bmfHdr.bfType = 0x4D42; // "BM" 
    dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
    bmfHdr.bfSize = dwDIBSize; 
    bmfHdr.bfReserved1 = 0; 
    bmfHdr.bfReserved2 = 0; 
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; 
    // 写入位图文件头 
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
    // 写入位图文件其余内容 
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); 
    //清除  
    GlobalUnlock(hDib); 
    GlobalFree(hDib); 
    CloseHandle(fh); 

    return S_OK;
    }