本文共 1565 字,大约阅读时间需要 5 分钟。
用CImage加载内存里的Image
问题:已知一块内存,知道里面是一张图片的数据,如何显示出来?
一种解决方法:
CImage(MFC or ATL)提供了一个加载内存中Image的成员函数HRESULT CImage::Load(IStream* pStream)。如何把指定的内存转换为IStream接口就成了需要解决的问题。最后发现获取一个ISteam还真是曲折:):
void LoadMemImage( void * pMemData, long len) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, len); void * pData = GlobalLock(hGlobal); memcpy(pData, pMemData, len); GlobalUnlock(hGlobal);
IStream * pStream = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE, & pStream) == S_OK) { CImage image; if (SUCCEEDED(image.Load(pStream))) { // .. } pStream -> Release(); } GlobalFree(hGlobal);
}
CImage从资源中加载图片文件 CImage直接加载图片文件倒是好办,直接用Load函数就可以,但是如何从工程资源中添加jpg、gif、png等图片呢?用下面这个函数
BOOL CDDCDlg::LoadImageFromResource(ATL::CImage *pImage, UINT nResID,LPCTSTR lpTyp) { if( pImage ==NULL)returnfalse; pImage->Destroy(); // 查找资源 HRSRC hRsrc =::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp); if(hRsrc ==NULL)returnfalse; // 加载资源 HGLOBAL hImgData =::LoadResource(AfxGetResourceHandle(), hRsrc); if(hImgData ==NULL) { ::FreeResource(hImgData); returnfalse; } // 锁定内存中的指定资源 LPVOID lpVoid =::LockResource(hImgData); LPSTREAM pStream =NULL; DWORD dwSize =::SizeofResource(AfxGetResourceHandle(), hRsrc); HGLOBAL hNew =::GlobalAlloc(GHND, dwSize); LPBYTE lpByte =(LPBYTE)::GlobalLock(hNew); ::memcpy(lpByte, lpVoid, dwSize); // 解除内存中的指定资源 ::GlobalUnlock(hNew); // 从指定内存创建流对象 HRESULT ht =::CreateStreamOnHGlobal(hNew,TRUE,&pStream); if( ht != S_OK ) { GlobalFree(hNew); } else { // 加载图片 pImage->Load(pStream); GlobalFree(hNew); } // 释放资源 ::FreeResource(hImgData); returntrue; }
转载地址:http://xkzli.baihongyu.com/