用directshow 实现抓图遇到的问题

原创 2006年06月09日 23:35:00

下面红色的一段是我按照Directshow开发指南敲下来的一个抓图函数

SnapshotBitmap( IBasicVideo * BasicVideo, const char * OutFile)
{
 if( BasicVideo )
 {
  long BitmapSize = 0;
  //首先获得图像大小
  if( SUCCEEDED( BasicVideo->GetCurrentImage( &BitmapSize,0)))
  {
   BOOL PassImage =  FALSE;
   unsigned char * Buffer = new unsigned char[BitmapSize];
   //获取图像帧数据
   if( SUCCEEDED( BasicVideo->GetCurrentImage(&BitmapSize,(long *)Buffer)))
   {
                BITMAPFILEHEADER hdr;//Bitmap的头文件信息
    LPBITMAPINFOHEADER lpbi;//Bitmap的文件信息(包括数据信息)
    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 ));
    //写入帧数据(包括BITMAPFILEHEADER 信息)
    BitmapFile.Write( Buffer,BitmapSize );
    BitmapFile.Close();
    PassImage = TRUE;
              }
   delete [] Buffer;
   
  }
 }
}

以下的是我在程序中的响应抓图事件的处理函数

OnBnClickedSnapshotbitmap()
{
 // TODO: 在此添加控件通知处理程序代码
 if ( FilterGraph)
  
 {
  MediaControl->Pause();
  // Firstly grab a bitmap to a temp file
  char  szTemp[] = "C://mysnapshot.bmp";
  SnapshotBitmap( BasicVideo,szTemp );

   // User can browser for a new file here
   CString   strFilter = "BMP File (*.bmp)|*.bmp|";
   CFileDialog dlgOpen(FALSE, ".bmp", NULL, OFN_HIDEREADONLY, strFilter, NULL);
   if (IDOK == dlgOpen.DoModal())
   {
    ::CopyFile(szTemp, dlgOpen.GetPathName(), TRUE);
    ::DeleteFile(szTemp);
   }
   MediaControl->Run();
  
 }
}

请问为什么会不可以正确的截图呢?

好像好多网上都是采用这个方法的!

这是我在CSDN发的第一篇,说得不太清楚 ,请大家谅解。

DirectShow之接口实战篇_多媒体播放器

引文来自http://www.itstudy.net/html/200902/27/20090227135938.htm 今自己编程做一个多媒体播放工具是一件很令人开心愉悦的事情,但如果使用Me...
  • xiaojun111111
  • xiaojun111111
  • 2016年08月09日 17:22
  • 453

C# WinForm DirectShow视频采集及图片抓取实例DxSnap

C# WinForm DirectShow视频采集及图片抓取实例DxSnap DirectShowSamples-2007-July\Samples\Capture\DxSnap Capture.c...
  • wangmj518
  • wangmj518
  • 2013年09月19日 15:04
  • 2818

VS2010基于DirectShows实现视频预览控件

之前用VFW实现视频预览控件,使用的时候经常会弹出视频源选择窗口,为了解决这个问题,采用最新的DirectShow来实现视频预览,而且VFW目前基本上已经不使用了,DirectX的功能比较强大。因需求...
  • wu_tongyu
  • wu_tongyu
  • 2014年12月16日 23:14
  • 1065

使用DirectShow的BaseClasses遇到的问题

在学习DirectShow时,难免会跑跑
  • legionmation
  • legionmation
  • 2014年05月08日 15:51
  • 1955

自学jsp,servlet遇到的一些问题

2016/7/28 1、遇到的问题:一个大jsp包含一个小jsp,小jsp要用到外面大jsp中用js提取到的属性值,本想用参数方式把js提取到的属性值传递给小jsp,但是Js不能直接给JSP赋值。j...
  • LRY1994
  • LRY1994
  • 2016年09月09日 20:18
  • 339

Python 3.4 简单的抓图脚本

初学 Python ,写了简单的小脚本import urllib.request import os# 未写 def proxy_open(): # 安装代理 步骤 # 1. 选择代理...
  • bkxiaoc
  • bkxiaoc
  • 2015年08月27日 13:42
  • 2061

DirectShow编程实现摄像头视频捕捉

前言 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用Direc...
  • zcj331
  • zcj331
  • 2014年04月11日 13:24
  • 1152

什么是DirectX,DirectShow与DirectX有什么区别?

在介绍同三维万能高清视频采集卡和全能音视频解码编码器软件等多媒体软件时,我们多次提到DirectShow、DirectX,那么什么是DirectShow?什么是DirectX,DirectShow与D...
  • wishfly
  • wishfly
  • 2015年10月17日 23:44
  • 991

第一个java Web项目中遇到的问题(上)

前两天开始学习J2EE,没有JavaWeb的任何经验,就靠着之前学习的一点点java知识在那撑着,才照着书上码了一个小Demo,过程中却果然问题多多。。。值得庆幸的是靠着各种折腾,现在解决了部分,这些...
  • sinat_33587403
  • sinat_33587403
  • 2016年03月17日 21:42
  • 1772

JavaWeb项目遇到的一些小问题(一)

1.下载功能出现的异常:  javax.servlet.ServletException: java.lang.IllegalArgumentException: Can not find a j...
  • u013131337
  • u013131337
  • 2016年03月23日 10:33
  • 1003
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用directshow 实现抓图遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)