hi je veux charger des images PNG et des images JPEG. P>
Quelqu'un peut-il m'aider? P>
7 Réponses :
Vous pouvez utiliser la classe Cimage qui prend en charge les formats suivants: JPEG, GIF, BMP et PNG. P>
http://msdn.microsoft.com/ EN-US / Bibliothèque / BWEA7BY5% 28VS.80% 29.aspx P>
Utiliser la fonction de charge pour charger le fichier à partir du disque: p>
http://msdn.microsoft.com/ EN-US / Bibliothèque / TF4BYTF8% 28VS.80% 29.aspx P>
CImage image; image.Load(_T("C:\\image.png")); // just change extension to load jpg CBitmap bitmap; bitmap.Attach(image.Detach());
Il est plus facile de charger des images PNG du fichier que de ressources
Si vous souhaitez être sûr que le fichier existe, vérifiez le code de retour Image.load (), sinon vous pourriez bien (comme je l'ai fait) obtenir une affirmation.
La classe CPngimage fait la même chose. (Disponible au moins depuis VS-2010)
utiliser cpicturecttrl, c'est OpenSource. P>
http: // www. codeproject.com/articles/24969/an-mfc-picture-control-a-dynamiquement-show-picture P>
//----- load png into CImage from resource bool Load( CImage * pimage, LPCTSTR lpszResourceName, HINSTANCE hinstRes) { if (hinstRes == NULL) { hinstRes = AfxFindResourceHandle(lpszResourceName, _T("PNG") ); } HRSRC hRsrc = ::FindResource(hinstRes, lpszResourceName, _T("PNG") ); if (hRsrc == NULL) { return false; } HGLOBAL hGlobal = LoadResource(hinstRes, hRsrc); if (hGlobal == NULL) { return false; } LPBYTE lpBuffer = (LPBYTE) ::LockResource(hGlobal); if (lpBuffer == NULL) { FreeResource(hGlobal); return false; } bool bRes = false; { UINT uiSize = ::SizeofResource(hinstRes, hRsrc); HGLOBAL hRes = ::GlobalAlloc(GMEM_MOVEABLE, uiSize); if (hRes != NULL) { IStream* pStream = NULL; LPVOID lpResBuffer = ::GlobalLock(hRes); ASSERT (lpResBuffer != NULL); memcpy(lpResBuffer, lpBuffer, uiSize); HRESULT hResult = ::CreateStreamOnHGlobal(hRes, TRUE, &pStream); if( hResult == S_OK) { pimage->Load(pStream); pStream->Release(); bRes= true; } } } UnlockResource(hGlobal); FreeResource(hGlobal); return bRes; }
Cette variante m'a permis de dessiner à cdc m_img.draw (dc.getsafehdc (), 0, 0, iwidth, iheight, 0, 0, iwidth, iheight);
CString pngPath=L"D:\\k.png"; CImage pngImage; CBitmap pngBmp; CDC bmDC; CBitmap *pOldbmp; BITMAP bi; //UINT xPos=450,yPos=300; UINT xPos=10,yPos=10; CClientDC dc(this); pngImage.Load(pngPath); // new code pngBmp.Attach(pngImage.Detach()); bmDC.CreateCompatibleDC(&dc); pOldbmp= bmDC.SelectObject(&pngBmp); pngBmp.GetBitmap(&bi); dc.BitBlt(xPos,yPos,bi.bmWidth,bi.bmHeight,&bmDC,0,0,SRCCOPY); bmDC.SelectObject(pOldbmp);
Il y a un simple CPngimage dans le MFC. Il est dérivé de Cbitmap et permet de charger un PNG en tant que Cbitmap. P>
afaik Cette classe est disponible depuis VS-2010. P>
pour les PNG qui proviennent de ressources vous rendront heureux. bitmap code> peut également être ajouté à un
CIMAGELIST code>. p> p>
C'est une pitié de ce bitmap perdrait toutes les valeurs alpha, j'avais manquante la transparence lors de la bitblt à CDC
Pourquoi mon PNG est-il inclus dans les ressources mais je ne peux pas utiliser son identifiant dans le code? Any1 sait s'il vous plaît aider