显示AVI文件某一帧的BMP图片,内存使用增加

HBack topsec 测试工程师  2011-07-13 04:09:04
大家帮忙看下这段代码
下面这个函数通过传进来的参数将AVI视频的某一帧显示在对应的控件区域内
调用一次内存使用就增加一点,内存使用随调用次数增加而增加,多调用几次图片不能正常显示
void CCutDlg::ShowBmp(int frame)
{
CRect bmprect;
m_Picture.GetClientRect(&bmprect);
m_Picture.MoveWindow(0,0,bmprect.Width(),bmprect.Height());

PAVISTREAM ps;
PAVIFILE pfile;
AVIFileInit(); //初始化AVIFile函数库
HRESULT hRet; //定义结果变量
hRet = AVIFileOpen(&pfile,m_Name,OF_READ, NULL); //打开源文件
if (hRet != 0) //判断文件是否打开成功
{
MessageBox("打开源文件错误","提示"); //弹出错误提示
return;
}

AVIFILEINFO pfinfo;
AVIFileInfo(pfile,&pfinfo,sizeof(AVIFILEINFO));
AVIFileGetStream(pfile, &ps, streamtypeVIDEO, 0 );//获取视频流
//获取流信息
AVISTREAMINFO streaminfo;
AVIStreamInfo(ps,&streaminfo,sizeof(AVISTREAMINFO));
PGETFRAME pFrame; //定义帧接口对象
pFrame=AVIStreamGetFrameOpen(ps,NULL); //在流中打开帧
LPBITMAPINFOHEADER bih;
bih = (LPBITMAPINFOHEADER) AVIStreamGetFrame(pFrame, frame);

BITMAPINFO Header;
memset(&Header,0,sizeof(BITMAPINFOHEADER));
Header.bmiHeader.biBitCount=bih->biBitCount ;
Header.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
Header.bmiHeader.biWidth = pfinfo.dwWidth;
Header.bmiHeader.biHeight = pfinfo.dwHeight;
Header.bmiHeader.biPlanes =bih->biPlanes;
Header.bmiHeader.biCompression =BI_RGB;
Header.bmiHeader.biXPelsPerMeter = 0;
Header.bmiHeader.biYPelsPerMeter = 0;

BITMAPFILEHEADER stFileHdr;
stFileHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
stFileHdr.bfSize=sizeof(BITMAPFILEHEADER);
stFileHdr.bfType= ((WORD)('M'<< 8)|'B');

BYTE* pDIB=new BYTE[(((pfinfo.dwWidth*Header.bmiHeader.biBitCount)+31)/8)*pfinfo.dwHeight];
BYTE* lpbuff;
lpbuff=pDIB;
lpbuff=(BYTE *)AVIStreamGetFrame(pFrame,frame);
lpbuff+=40;

CClientDC dc(this); //生成一个与当前窗口相关的CClientDC
HBITMAP m_hBitmap;
//生成DIBitmap数据
m_hBitmap = CreateDIBitmap(dc.m_hDC,&Header.bmiHeader,CBM_INIT,lpbuff,&Header,DIB_RGB_COLORS);
delete[] pDIB;

AVIStreamGetFrameClose(pFrame);
if (m_hBitmap != NULL)
{
m_Picture.SetBitmap(m_hBitmap);
m_Picture.UpdateData();
}
BITMAP bmp;
GetObject(m_hBitmap,sizeof(bmp),&bmp);
CRect rect;
m_fDlg->GetClientRect(rect);
int xpos = m_fDlg->GetScrollPos(SB_HORZ);
if (xpos != 0)
m_fDlg->ScrollWindow(xpos,0); //恢复窗口的水平滚动区域
int ypos = m_fDlg->GetScrollPos(SB_VERT);
if (ypos != 0)
m_fDlg->ScrollWindow(0,ypos); //恢复窗口的垂直滚动区域

SCROLLINFO vinfo;
vinfo.cbSize = sizeof(vinfo);
vinfo.fMask = SIF_ALL;
vinfo.nPage = bmp.bmHeight/10;
vinfo.nMax= bmp.bmHeight-rect.Height()+bmp.bmHeight/10;
vinfo.nMin = 0;
vinfo.nTrackPos = 0;
vinfo.nPos = 0;
//设置垂直滚动条信息
m_fDlg->SetScrollInfo(SB_VERT,&vinfo);

vinfo.fMask = SIF_ALL;
vinfo.nPage = bmp.bmWidth/10;
vinfo.nMax= bmp.bmWidth-rect.Width()+bmp.bmWidth/10;
vinfo.nMin = 0;
vinfo.nPos = 0;
vinfo.nTrackPos = 0;
vinfo.cbSize = sizeof(vinfo);
//设置水平滚动条信息
m_fDlg->SetScrollInfo(SB_HORZ,&vinfo);
if(pfile != NULL)
AVIFileRelease(pfile);
AVIFileExit();
}
这个函数是什么原因造成内存使用增加的,某个资源没有释放掉么,像很多程序后面一串...release()
还有传进来的参数是AVI文件的最后一帧(文件总帧数是15帧,调用ShowBmp(15))的时候程序弹出应用程序错误提示框
0x00403113指令引用的0x0000000e内存。改内存不能为read 这个怎么处理
...全文
72 点赞 收藏 3
写回复
3 条回复
HBack 2011年07月18日
我将2个功能相似的函数对比了一下添加了一句AVIStreamClose(ps);内存的问题解决了
多次调用 图片显示的问题还是没有解决
在最后一帧的显示提示错误 通过断点找到是下面2句代码有问题
Header.bmiHeader.biBitCount=bih->biBitCount;
Header.bmiHeader.biPlanes=bih->biPlanes;
不知道怎么解决
回复 点赞
HBack 2011年07月14日
没有人啊 没有人
看来走多地儿了.......
回复 点赞
liangxd09 2011年07月14日
内存泄露撒,你仔细检查gdi哪些没释放 new的没释放?
回复 点赞
发动态
发帖子
资源
创建于2007-09-28

2318

社区成员

1.8w+

社区内容

VC/MFC 资源
社区公告
暂无公告