2009-12-13 9 views
0

J'ai un problème avec mon application MFC. Lorsque j'essaie de désérialiser CBitmap de l'archive et de créer une nouvelle CBitmap, elle ne charge pas correctement les bits de CBitmap.Deserialize Bitmap from Archive

Voici le code:

BITMAP bm; 
ar >> bm.bmType; 
ar >> bm.bmWidth; 
ar >> bm.bmHeight; 
ar >> bm.bmWidthBytes; 
ar >> bm.bmPlanes; 
ar >> bm.bmBitsPixel; 
int nSize = bm.bmWidth * bm.bmHeight; 
bm.bmBits = new BYTE[nSize]; 
ar.Read(bm.bmBits, nSize); 
CBitmap* tmp = new CBitmap; 
tmp->CreateBitmapIndirect(&bm); 
BITMAP bmi; 
tmp->GetBitmap(&bmi); 
HBITMAP hNew = (HBITMAP)CopyImage((HBITMAP)(*tmp), IMAGE_BITMAP, 
    bmi.bmWidth, bmi.bmHeight, LR_CREATEDIBSECTION); 
m_bmp.Attach(hNew); 
delete tmp; 

Après je tmp-> GetBitmap (& bmi); Je reçois NULL dans le champ bmi.bmBits.

Quel est le problème avec cela? Comment puis-je le faire fonctionner?

P.S. Je ne dois pas utiliser la sérialisation dans le fichier * .bmp.

Merci d'avance, Mike.

Répondre

0

Si vous pouvez changer votre sérialisation cela fonctionnera, bmp est HBITMAP:

// store 
CImage image; 
image.Attach(bmp); 
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, 0); 
IStream* pStream; 
CreateStreamOnHGlobal(hMem, TRUE, &pStream); 
image.Save(pStream, Gdiplus::ImageFormatBMP); 
size_t nSize = GlobalSize(hMem); 
LPVOID buff = GlobalLock(hMem); 
ar << nSize; 
ar.Write(buff, nSize); 
GlobalUnlock(hMem); 
GlobalFree(hMem); 


// load 
size_t nSize; 
ar >> nSize; 
HGLOBAL hMem = GlobalAlloc(GHND, nSize); 
LPVOID buff = GlobalLock(hMem); 
ar.Read(buff, nSize); 
GlobalUnlock(hMem); 
IStream* pStream; 
CreateStreamOnHGlobal(hMem, TRUE, &pStream); 
CImage image; 
image.Load(pStream); 
bmp = image.Detach(); 
GlobalFree(hMem); 
+0

Merci beaucoup, Nikola !!! Ça marche vraiment! Dieu te bénisse!!! – Mike