DirectShow图片的抓取

DirectShow图片的抓取
2010-08-11 14:31
转载自 MegaChan
最终编辑 Guo_1017
第1种方法是使用IBasicVideo::GetCurrentImage:
bool SnapshotBitmap(IBaseicVideo *pBasicVideo,const char *outFile)
{
    if(pBasicVideo)
 {
  long bitmapSize=0;
  //首先获得图像大小
  if(SUCCEEDED(pBasicVideo->GetCurrentImage(&bitmapSize,0)))
  {
   bool pass=false;
   //分配图像帧内存
   unsigned char *buffer=new unsigned char[bitmapSize];
   //获取图像帧数据
   if(SUCCEEDED(pBasicVideo->GetCurrentImage(&bitmapSize,(long*)buffer)))
   {
    BITMAPFILEHEADER hdr;
    LPBITMAPINFOHEADER lpbi;
    lpbi=(LPBITMAPINFOHEADER)buffer;
    int nColors=1<<lpbi->biBitCount;
    if(nColors>256)
    nColors=0;
    hdr.bfType=((WORD)('M'<<8)|'B');
    hdr.bfSize=bitmapSize+sizeof(hdr);
    hdr.bfReserved1=0;
    hdr.bfReserved2=0;
    hdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+lpbi->biSize+nColors*sizeof(RGBQUAD));
    CFile bitmapFile(outFile,CFile::modeReadWrite|CFile::modeCreate|CFile::typeBinary);
    //写入位图文件头
    bitmapFile.Write(&hdr,sizeof(BITMAPFILEHEADER));
    //写入图像帧数据
    bitmapFile.Write(buffer,bitmapSize);
    bitmapFile.Close();
    pass=true;
   }
   delete []buffer;
   return pass;
  }
 }
 return false;
}
第2种方法比较复杂,使用Sample Grabber Filter.
阅读更多
文章标签: buffer delete 2010
个人分类: DirectShow
上一篇在VS2008下使用OpenCV的方法 ——附图说明非常详细
下一篇用DirectShow抓取影片帧
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭