我在网上看到了这样一段代码,但是不明白Cbmp2aviDlg的基类是什么?avifileopen中strAVIFileName参数应该怎么写?比如avi文件在D盘a文件夹下。求大侠指点,谢谢
这是那段代码的地址:
http://zhidao.baidu.com/question/8252506.html
C++来获取AVI文件的一桢图象
答案:2 悬赏:50
解决时间 2021-04-27 21:52
- 提问者网友:泪姬迷茫
- 2021-04-27 04:03
最佳答案
- 二级知识专家网友:樣嘚尐年
- 2021-04-27 04:19
Cbmp2aviDlg的基类必须是mfc的对话框基类 CDlg,至于strAVIFileName你可以写绝对路径或者相对路径,绝对路径靠谱一点 d:/a/文件.avi or d:\\a\\文件.av
全部回答
- 1楼网友:偏爱自由
- 2021-04-27 05:50
给你个例子哈
void cbmp2avidlg::avitobmp(cstring stravifilename, cstring strbmpdir)
{
// todo: 在此添加控件通知处理程序代码
avifileinit();
pavifile avi;
int res=avifileopen(&avi, stravifilename, of_read, null);
int n = getlasterror();
if (res!=avierr_ok)
{
//an error occures
if (avi!=null)
avifilerelease(avi);
return ;
}
avifileinfo avi_info;
avifileinfo(avi, &avi_info, sizeof(avifileinfo));
pavistream pstream;
res=avifilegetstream(avi, &pstream, streamtypevideo ,
0 );
if (res!=avierr_ok)
{
if (pstream!=null)
avistreamrelease(pstream);
avifileexit();
return ;
}
//do some task with the stream
int inumframes;
int ifirstframe;
ifirstframe=avistreamstart(pstream);
if (ifirstframe==-1)
{
//error getteing the frame inside the stream
if (pstream!=null)
avistreamrelease(pstream);
avifileexit();
return ;
}
inumframes=avistreamlength(pstream);
if (inumframes==-1)
{
//error getteing the number of frames inside the stream
if (pstream!=null)
avistreamrelease(pstream);
avifileexit();
return ;
}
//getting bitmap from frame
bitmapinfoheader bih;
zeromemory(&bih, sizeof(bitmapinfoheader));
bih.bibitcount=24; //24 bit per pixel
bih.biclrimportant=0;
bih.biclrused = 0;
bih.bicompression = bi_rgb;
bih.biplanes = 1;
bih.bisize = 40;
bih.bixpelspermeter = 0;
bih.biypelspermeter = 0;
//calculate total size of rgbquad scanlines (dword aligned)
bih.bisizeimage = (((bih.biwidth * 3) + 3) & 0xfffc) * bih.biheight ;
pgetframe pframe;
pframe=avistreamgetframeopen(pstream, null );
avistreaminfo streaminfo;
avistreaminfo(pstream,&streaminfo,sizeof(avistreaminfo));
//get the first frame
bitmapinfoheader bih2;
long lsize = sizeof(bih2);
int index=0;
for (int i=ifirstframe; i<inumframes; i++)
{
index= i-ifirstframe;
byte* pdib = (byte*) avistreamgetframe(pframe, index); //
avistreamreadformat(pstream,index,&bih2,&lsize);
bitmapfileheader stfilehdr;
byte* bits=new byte[bih2.bisizeimage];
avistreamread(pstream,index,1,bits,bih2.bisizeimage,null,null);
//rtlmovememory(bits, pdib + sizeof(bitmapinfoheader), bih2.bisizeimage);
bih2.biclrused =0;
stfilehdr.bfoffbits=sizeof(bitmapfileheader)+sizeof(bitmapinfoheader);
stfilehdr.bfsize=sizeof(bitmapfileheader);
stfilehdr.bftype=0x4d42;
cstring filename;
filename.format("frame-%05d.bmp", index);
cstring strtemp = strbmpdir;
strtemp += "";
strtemp += filename;
file* fp=_tfopen(strtemp ,_t("wb"));
fwrite(&stfilehdr,1,sizeof(bitmapfileheader),fp);
fwrite(&bih2,1,sizeof(bitmapinfoheader),fp);
int ff = fwrite(bits,1,bih2.bisizeimage,fp);
int e = getlasterror();
fclose(fp);
/////
delete bits;
//createfrompackeddibpointer(pdib, index);
}
avistreamgetframeclose(pframe);
//close the stream after finishing the task
if (pstream!=null)
avistreamrelease(pstream);
avifileexit();
}
主要用到avistreamgetframe函数
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯