2015-07-28 1 views
0

Je travaille avec certaines images dans une application MFC et j'ai réalisé que la classe CImage (de MFC) a deux types de sauvegarde, un fichier et une interface IStream. J'essaie d'utiliser cette interface IStream pour enregistrer en mémoire, en utilisant les fonctions de convention de la classe CImage sans une autre bibliothèque pour le faire (par exemple conversion bmp en jpg). Je ne veux pas enregistrer un fichier, il suffit de travailler avec les tampons de mémoire. L'objet CImage est déjà chargé avec un fichier image.Utilisation de CImage.Save (InMemory)

Mais je ne suis pas capable d'utiliser cette interface IStream car je ne peux pas créer un objet à partir de cette classe et ne pas réalisé comment créer le tampon à utiliser avec cette fonction Enregistrer (IStream * pStream ...).

Tout exemple sera très utile.

Merci, Vitor

Répondre

0

D'abord, vous devez ajouter votre photo à un identifiant de ressource et de faire comme ceci:

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; 
}