2015-07-28 4 views
0

Я работаю с некоторыми изображениями в приложении MFC, и я понял, что класс CImage (из MFC) имеет 2 типа сохранения, в файл и интерфейс IStream. Я пытаюсь использовать этот интерфейс IStream для сохранения в памяти, используя условные функции класса CImage без другой библиотеки, чтобы сделать это (например, преобразование bmp в jpg). Я не хочу сохранять файл, просто работаю с буферами памяти. Объект CImage уже загружен файлом изображения.Использование CImage.Save (InMemory)

Но я не могу использовать этот интерфейс IStream, потому что я не могу создать объект из этого класса и не понял, как создать буфер для использования с этой функцией Save (IStream * pStream ...).

Любой пример будет очень полезен.

Спасибо, Витор

ответ

0

Во-первых, вы должны добавить свою фотографию в идентификатор ресурса, и сделать так:

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; 
} 
Смежные вопросы