Bonjour à tous,
Dans le cadre d'un projet perso, je dois afficher une image sur une partie d'une fenêtre.
J'ai bricoler une première version en utilisant GDI pour l'affichager et ne permettant de charger que des images bitmap. Je voudrais à présent pouvoir utiliser les types d'images les plus courants.
J'ai pas mal potassé la MSDN sur le module WIC et lu leurs exemples, et j'ai bricolé une méthode me permettant de récupérer un HBITMAP à partir d'un nom de fichier (récupéré dans un fichier de conf', donc pas possible de jouer avec les ressources) :
La géstion des erreurs n'est pas top, elle sera complètée plus tard.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
48 HBITMAP Player::loadBitmap(wstring filepath) { HBITMAP hBitmap; HRESULT hr; UINT width, height; IWICImagingFactory *pFactory = NULL; IWICBitmapDecoder *pDecoder = NULL; IWICBitmapFrameDecode *pFrame = NULL; IWICBitmapSource *pBitmap = NULL; // Create an image factory that loads decoder hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID*)&pFactory); hr = pFactory->CreateDecoderFromFilename(filepath.c_str(), NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &pDecoder); // Retrieve the first frame hr = pDecoder->GetFrame(0, &pFrame); hr = pFrame->QueryInterface(IID_IWICBitmapSource, (void**)(&pBitmap)); hr = pBitmap->GetSize(&width, &height); // Convert this frame for GDI processing HDC hd = GetDC(NULL); BYTE *pvImageBits = NULL; BITMAPINFO bitmapInfo; ZeroMemory(&bitmapInfo, sizeof(BITMAPINFO)); bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitmapInfo.bmiHeader.biWidth = width; bitmapInfo.bmiHeader.biHeight = -(LONG)height; bitmapInfo.bmiHeader.biPlanes = 1; bitmapInfo.bmiHeader.biBitCount = 32; bitmapInfo.bmiHeader.biCompression = BI_RGB; hBitmap = CreateDIBSection(hd, &bitmapInfo, DIB_RGB_COLORS, (void**)&pvImageBits, NULL, 0); ReleaseDC(NULL, hd); // Extract image into hbitmap hr = pBitmap->CopyPixels(NULL, width*4, (width*4)*height, pvImageBits); return hr == S_OK ? hBitmap : NULL; }
Après un passage sur le débugger, hr est toujours à S_OK. Donc le chargement devrait s'être passé correctement.
Mais lorsque l'image est affiché, j'obtiens un effet étrange :
L'original est en couleur. De plus, la largeur a été réduite (l'image d'origine occupe aussi la partie noire à droite).
J'ai testé avec différents formats d'images, et le rendu est toujours le même.
J'ai vérifié si les largeurs et hauteurs récupérées par GetSize sont corrects : pas de soucis.
L'affichage se fait de la même manière que lorsque je chargeais mes images avec LoadImage (api windows). Et en réutilisant cette fonction native, je n'ai aucun soucis.
Sauriez-vous d'où viens le problème ? J'ai eu pas mal de mal à bien saisir les concepts de WIC, je pense que j'ai dû louper quelque chose.
Merci
Partager