本文主要是介绍CImage从内存和资源中加载图片文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
用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;
}
这篇关于CImage从内存和资源中加载图片文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!