1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| HRESULT hr;
CoInitialize(0);
HBITMAP hbmp_dst = 0;
SIZE_T nSize = this->tailleImage;
// copie image jpeg dans global
HGLOBAL hgbl = (HGLOBAL)GlobalAlloc(GMEM_FIXED, nSize);
memcpy(hgbl, this->bufImage, nSize);
// création du stream d'échange
IStream* stream = 0;
// image jpeg dans global dans stream
hr = CreateStreamOnHGlobal(hgbl, TRUE, &stream);
if(!SUCCEEDED(hr) || !stream) { // si erreur libération des objets déja crées
GlobalFree(hgbl);
CoUninitialize();
return false;
} else {
// création d'une 'picture'
IPicture* picture = 0;
// conversion stream vers picture
hr = OleLoadPicture(stream, nSize, FALSE, IID_IPicture, (void**)&picture);
if(!SUCCEEDED(hr) || !picture) { // si erreur libération des objets déja crées
stream->Release();
GlobalFree(hgbl);
CoUninitialize();
return false;
} else {
HBITMAP hbmp_src;
// recuperation du handle de la 'picture'
picture->get_Handle((OLE_HANDLE *)&hbmp_src);
// recuperation du handle du bitmap de la 'picture'
BITMAP bmp;
GetObject(hbmp_src, sizeof bmp, &bmp);
// bmp est le bitmap resultant mais son pointeur vers le contenu pointe vers le contenu de 'picture'
// comme on va dechargé la 'picture' on copie dans une autre zone memoire
hbmp_dst = (HBITMAP)CopyImage(hbmp_src, IMAGE_BITMAP, 0, 0, 0);
picture->Release();
stream->Release();
GlobalFree(hgbl);
CoUninitialize();
}
}
this->hbmp = hbmp_dst; |
Partager