用directshow 实现抓图遇到的问题

下面红色的一段是我按照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发的第一篇,说得不太清楚 ,请大家谅解。

### 回答1: DirectShow 是一种用于多媒体应用程序开发的Microsoft技术,可以实现视频的实时显示并抓图,并且还可以设置视频参数。在DirectShow中,可以通过构建图形和过滤器图来实现这些功能。 首先,要实现视频的实时显示,我们需要创建一个视频捕捉过滤器,并连接到显示过滤器。通过DirectShow提供的接口,可以选择摄像头设备作为视频源,然后创建一个Sample Grabber过滤器用于捕获视频图像。Sample Grabber过滤器可以设置回调函数,在视频数据接收时即时处理图像数据。然后将捕捉到的视频数据通过DirectShow的某个视频渲染器过滤器进行显示,如VideoRenderer。 其次,要实现视频的抓图,可以使用Sample Grabber过滤器,捕获图像后保存为位图格式或其他图像格式。我们可以在回调函数中获取图像数据,并将其保存为图像文件。这样,我们就能够实现对视频流的实时截图。 最后,DirectShow还可以设置视频参数,如帧率、分辨率、亮度、对比度等。通过获取视频源过滤器的接口,可以设置这些参数,以调整视频显示效果。 综上所述,直接展示和抓取图像的方法包括创建视频捕捉过滤器、Sample Grabber过滤器和视频渲染器过滤器,并利用回调函数处理图像数据实现实时显示和抓图。此外,还可以通过DirectShow接口设置视频参数,以改变视频的显示效果。 ### 回答2: DirectShow是一套功能强大的多媒体框架,可以用于实现视频的实时显示并抓图,并且还可以设置视频的参数。 要实现视频的实时显示,首先需要使用DirectShow创建一个图形化用户界面窗口,并将视频源与该窗口进行关联。可以使用DirectShow提供的基本组件来实现这一功能,比如视频捕捉组件,将摄像头或者其他视频源的输入传递给视频渲染组件,然后通过渲染组件将视频显示在窗口中。 在实时显示视频的过程中,我们可以设置视频的参数。DirectShow提供了丰富的接口和功能,可以通过控制接口对视频进行参数设置。例如可以调整视频的亮度、对比度、色彩饱和度等等。还可以调整视频的分辨率、帧率、编解码格式等参数,以满足具体应用场景的需求。 另外,DirectShow还可以实现视频的抓图功能。通过调用DirectShow提供的接口,我们可以将当前视频帧保存为图像文件,以便于后续的处理和使用。可以设置抓图的分辨率和格式,以满足不同场景下的需求。 总结起来,DirectShow可以实现视频的实时显示并抓图,还可以设置视频的参数。它是一个功能强大、灵活性高的多媒体框架,为开发者提供了丰富的接口和工具,以便于实现多样化的视频处理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值