VC显示JPG图像的问题

littlefangMFC 2009-04-12 03:57:02
我用网上一段常见的代码读入JPG图片并显示(代码如下),我是在OnDraw()中调用的,结果只要我的界面一发生重绘,内存就会严重泄露,重绘一次内存就上涨一次,请教如何解决,谢谢帮助!
void CMonitorView::LoadPicture(CRect rect, CString FilePath, CDC *pDC)
{
IPicture *pPicture;//声明OLE提供的图像对象
IStream *pStrm;//声明一个流对象
CFileStatus fstatus;
CFile file;
LONG cb;
if((file.Open(FilePath,CFile::modeRead))&&(file.GetStatus(FilePath,fstatus))&&((cb=fstatus.m_size)!=-1))
{
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData=NULL;
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)
{
file.ReadHuge(pvData,cb);//将图像文件数据读入内存
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStrm);//创建流对象
if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPicture))) //根据流对象pStrm初始化图像对象pPicture
{
OLE_XSIZE_HIMETRIC Width;
OLE_YSIZE_HIMETRIC Height;
pPicture->get_Width(&Width);
pPicture->get_Height(&Height);
//得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素
if(FAILED(pPicture->Render(*pDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,0,Height,Width,-Height,NULL)))
AfxMessageBox("渲染图片失败");
pPicture->Release();
}
else
AfxMessageBox("从流中获取图片失败!");
}
}
}
else
{
AfxMessageBox("无法打开图像!");
}
...全文
251 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobohack 2009-04-13
  • 打赏
  • 举报
回复
lwx300 2009-04-13
  • 打赏
  • 举报
回复
// IPicture 类:

CPicture - The Yovav (Horror) PictureShow
http://www.codeproject.com/KB/graphics/pictureshow.aspx
xghuzd 2009-04-13
  • 打赏
  • 举报
回复
是在OnDrow()里调用LoadPicture的吧.
那就是每次都分配一次内存.
所以每次都要释放.

[Quote=引用 7 楼 cnzdgs 的回复:]
pStrm->Release();
[/Quote]
DavidHsing 2009-04-13
  • 打赏
  • 举报
回复
CImage,
VS2008, sp1
可以支持 jpg gif png,内部就是使用 GDI+。
不过可惜的是不支持从资源中载入图像。
littlefangMFC 2009-04-13
  • 打赏
  • 举报
回复
谢谢各位
luckyboy101 2009-04-13
  • 打赏
  • 举报
回复
mark
littlefangMFC 2009-04-13
  • 打赏
  • 举报
回复
谢谢
wukubobo 2009-04-13
  • 打赏
  • 举报
回复
CxImage比较方便啊楼主
cnzdgs 2009-04-12
  • 打赏
  • 举报
回复
pStrm->Release();
hust_terry 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 littlefangMFC 的回复:]
TO1楼:
我刚刚查资料也发现了这个问题,确实是没有调用GlobalFree()函数,呵呵,以前从来没用过。
请问下,所有的GlobalAlloc()都要和GlobalFree()配套使用吗,就像new和delete一样?谢谢
[/Quote]


你说的没错。
littlefangMFC 2009-04-12
  • 打赏
  • 举报
回复
谢谢wqvbjhc
//释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
我的就是32位的程序吧应该?如果我不调用这句的话内存就会长。
你说32位程序系统会自动释放是不是说在我程序退出的时候系统才会释放啊?谢谢你
littlefangMFC 2009-04-12
  • 打赏
  • 举报
回复
TO1楼:
我刚刚查资料也发现了这个问题,确实是没有调用GlobalFree()函数,呵呵,以前从来没用过。
请问下,所有的GlobalAlloc()都要和GlobalFree()配套使用吗,就像new和delete一样?谢谢
wqvbjhc 2009-04-12
  • 打赏
  • 举报
回复
最后一步错了,应为:
pPicture->Release();
后面添加
// 释放不要的picture对象,并把指针清空
pPicture=NULL;

//释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
wqvbjhc 2009-04-12
  • 打赏
  • 举报
回复
file.ReadHuge(pvData,cb);//将图像文件数据读入内存
ReadHuge方法已经过进了,用Read吧.
后面添加一下file.Close();


if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPicture))) //根据流对象pStrm初始化图像对象pPicture
{
后面添加
// 释放不要的stream对象并清空stream指针
pStm->Release();
pStm=NULL;


pPicture->Release();
后面添加
// 释放不要的picture对象,并把指针清空
pPic->Release();
pPic=NULL;

//释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
黄志义 2009-04-12
  • 打赏
  • 举报
回复
GlobalAlloc申请的内存释放了吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧