Ciao, voglio caricare immagini png e immagini jpeg.Come caricare immagini .png, .jpeg usando MFC?
qualcuno può aiutarmi?
Ciao, voglio caricare immagini png e immagini jpeg.Come caricare immagini .png, .jpeg usando MFC?
qualcuno può aiutarmi?
CImage image;
image.Load(_T("C:\\image.png")); // just change extension to load jpg
CBitmap bitmap;
bitmap.Attach(image.Detach());
È possibile utilizzare la classe CImage che supporta i seguenti formati: JPEG, GIF, BMP e PNG.
http://msdn.microsoft.com/en-us/library/bwea7by5%28VS.80%29.aspx
Utilizzare la funzione Load per caricare file dal disco:
http://msdn.microsoft.com/en-us/library/tf4bytf8%28VS.80%29.aspx
uso CPictureCtrl, è opensource.
http://www.codeproject.com/Articles/24969/An-MFC-picture-control-to-dynamically-show-picture
//----- 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;
}
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);
c'è una semplice CPngImage nel MFC. È derivato da CBitmap e consente di caricare un PNG come CBitmap.
AFAIK questa classe è disponibile da VS-2010.
Per PNG che provengono da risorse
CPngImage pngImage;
pngImage.Load(YOUR_RESOURCE_ID, AfxGetResourceHandle());
CBitmap bitmap;
bitmap.Attach(pngImage.Detach());
vi renderà felici. bitmap
può anche essere aggiunto a un CImageList
.
È un peccato che un tale bitmap possa perdere tutti i valori alpha, mi mancava la trasparenza quando eseguivo BitBlt su CDC – BlackBada
È più semplice caricare le immagini PNG dal file rispetto alla risorsa –
Se si vuole essere certi che il file esista, controllare il codice di ritorno image.Load(), altrimenti si potrebbe ottenere (come ho fatto) un ASSERT. – akame
La classe CPngImage fa lo stesso. (Disponibile almeno dal VS-2010) – xMRi