11
votes

Comment charger des images .png, .jpeg à l'aide de MFC?

hi je veux charger des images PNG et des images JPEG.

Quelqu'un peut-il m'aider?


0 commentaires

7 Réponses :


7
votes

Vous pouvez utiliser la classe Cimage qui prend en charge les formats suivants: JPEG, GIF, BMP et PNG.

http://msdn.microsoft.com/ EN-US / Bibliothèque / BWEA7BY5% 28VS.80% 29.aspx

Utiliser la fonction de charge pour charger le fichier à partir du disque:

http://msdn.microsoft.com/ EN-US / Bibliothèque / TF4BYTF8% 28VS.80% 29.aspx


0 commentaires

28
votes
CImage image;
image.Load(_T("C:\\image.png")); // just change extension to load jpg
CBitmap bitmap;
bitmap.Attach(image.Detach());

3 commentaires

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)




19
votes
//----- 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;
}

1 commentaires

Cette variante m'a permis de dessiner à cdc m_img.draw (dc.getsafehdc (), 0, 0, iwidth, iheight, 0, 0, iwidth, iheight);



1
votes
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);

0 commentaires

1
votes

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.

afaik Cette classe est disponible depuis VS-2010.


0 commentaires

4
votes

pour les PNG qui proviennent de ressources xxx

vous rendront heureux. bitmap peut également être ajouté à un CIMAGELIST .


2 commentaires

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