中易网

C++来获取AVI文件的一桢图象

答案:2  悬赏:50  
解决时间 2021-04-27 21:52
  • 提问者网友:泪姬迷茫
  • 2021-04-27 04:03
我在网上看到了这样一段代码,但是不明白Cbmp2aviDlg的基类是什么?avifileopen中strAVIFileName参数应该怎么写?比如avi文件在D盘a文件夹下。求大侠指点,谢谢

这是那段代码的地址:
http://zhidao.baidu.com/question/8252506.html
最佳答案
  • 二级知识专家网友:樣嘚尐年
  • 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函数
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息