使用CImage.Save(InMemory)

时间:2015-07-28 18:30:10

标签: c++ mfc gdi+ istream

我正在使用MFC应用程序中的一些图片,我意识到CImage类(来自MFC)有两种类型的保存,一个文件和一个IStream接口。我正在尝试使用该IStream接口保存到内存,使用CImage类的约定功能,而无需另外的库(例如bmp到jpg转换)。我不想保存文件,只需使用内存缓冲区。 CImage对象已加载图片文件。

但是我无法使用这个IStream接口,因为我无法从该类创建一个对象,也没有意识到如何创建缓冲区以用于该Save(IStream * pStream ...)功能。

任何例子都会非常有用。

谢谢, 维托尔

1 个答案:

答案 0 :(得分:0)

首先,您应该将您的图片添加到资源ID中,并执行以下操作:

BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, CImage * & pImg)
{
    HINSTANCE hInst = AfxGetResourceHandle();
    HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nID), sTR); // type  
    if (!hRsrc)
        return FALSE;
    // load resource into memory  
    DWORD len = SizeofResource(hInst, hRsrc);
    BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
    if (!lpRsrc)
        return FALSE;
    // Allocate global memory on which to create stream  
    HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
    BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
    memcpy(pmem, lpRsrc, len);
    IStream* pstm = NULL;
    CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
    // load from stream  
    //pImg = Gdiplus::Image::FromStream(pstm);
    pImg = new CImage();
    pImg->Load(pstm);
    DWORD err = GetLastError();
    // free/release stuff  
    GlobalUnlock(m_hMem);
    pstm->Release();
    FreeResource(lpRsrc);
    return TRUE;
}