DirectShow获取一张图片.docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DirectShow获取一张图片

DirectShow:图片的抓取 zz?? 在播放媒体文件的过程中,有一个很有用的功能,就是在当前播放的位置抓取图,实现这种图片抓取功能的方法很多,我们这里只介绍常用的两种。?第1种方法最简单,它使用1BasicVideo::GetCurrentImage接口方法,代码如下。???boolSnapshotBitmap(IBasicVideo*pBa8icVideo,ê? constchar*OutFile)if (pBasicVldeo){longbitmapSize=0;ê?//首先获得图像大小if(SUCCEEDED(pEasicVidee-GetcurrentImage(bitmapSize,ê?0))){bool pass=false;ê?//分¤?配?图a?像?帧?内¨2存??unsignedchar*buffer=newunsignedchar[bitmapSize];//获?取¨?图a?像?帧?数oy据Yif(SUCCEEDED(pBasicVideo-GetCurrentImage(bitmapSize,(long*)buffer))){BITMAPFILEHEADER hdr;ê?LPBITMAPINFOHEADER ipbi;ê?ipbi=(LPBITMAPINFOHEADER)buffer;ê?intnColors=1ipbi-biBitCount;ê?if(nColors256)//always is”?àBM”?àhdr.bfType =((WORD)(‘?M’?¥8)|’?¥B’?¥);ê?hdr.ê?bfSize =bitmapSize+sizeof(hdr);ê?hdr.ê?bfReservedl =0;hdr.ê?bfReserved2 =0;ê?hdr.ê?bfOffBits =(DWORD)(sizeof(BITMAPFILEHEADER)+lpbi-biSize+nColors*sizeof(RGBQUAD));CFilebitmapFile(outFile,ê?CFile:êo:êomodeReadWrite |CFile:êo:êomodeCreate | CFile:êo:êotypeBinary);ê?//写??入¨?位?图a?文?件t头a?¤bitmapFile.ê?Write{hdr,ê?sizeof【?BITMApFILEHEADER));//写??入¨?图a?像?帧?数oy据Y(包?¨1括¤?§BITMAPINFOHEADER信?息?é)bitmapFile.ê?Write(buffer,ê?bitmapSize);ê?bitmapFile.ê?Close();ê?pas8=true;}delete[]burfer;ê?return Pass;}returnfalse ;??值得注意的是,IBasieVideo接口应该从Filter?Graph?Manager上获得,但真正实现在Renderer?Filter 上。如果我们使用的是传统的Video?Renderer,那么使用GetCurrentlmage 抓图将是不可靠的。因为如果Video?Renderer使用了DirectDraw加速,这个函数调用会失败;而且调用这个函数,Video?Renderer必须处于暂停状态。但如果我们使用的是VMR,则没有上述这些限制。??第2种方法比较复杂.它使用Sample?Grabber?Filter。它其实是一个Trans-In-PlaceFilter,在SDK安装目录下的Samples\C++\DirectShow’Filters\Grabber提供了源代码。实际上,Sample?Grabber可以抓取任何类型的Sample。但在这里,我们只介绍使用它抓取视频帧的方法。步骤如下:(1)创建Sample?Grabber,并将之加入到Filter?Graph中。//Create?the?Sample?GrabberIBaseFilter*pGrabberF=NULL;hr=CoCreateInstanee(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,????IID?IBaseFilter,??(void**)pGrabberF);if(FAILED(hr)){?????//Return?an?error}?hr=pGraph-AddFilter(pGrabberF,LSample?Grabber);if(FAILED(hr){????//Return?an?error}ISampleGrabber*pGrabber=NULL;pGrabberF-QueryInterface(IID_ISampleGra

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档