用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发的第一篇,说得不太清楚 ,请大家谅解。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于添中ISampleGrabber滤波器实现单帧抓图的问题

/////////////////////////////////////////////////////////////////////////// //2016-4-26  关于加入ISample...

使用纯net技术实现抓屏(包含连续抓图和鼠标的问题的解决方法)

之前转载了一篇关于api抓屏的实例,本次载的是老外Jason Hensley写的抓屏,实现方式与上次不同,可以方便大家对比 ''开发平台 VB.NET 2005  ''Description: ...

Java实现简单的屏幕抓图

TestSort.java package cn.gyzt.testsort; /** * Java递归实现折中算法 * @author 漆艾林 * @param */ publ...

Go语言实现抓图实例

Go语言实现网页抓图功能。

一个简单的用JAVA实现的屏幕抓图(源代码)

import java.io.*; import java.net.*; import javax.swing.*; import java.awt.*; import java.awt.ev...

用VC实现抓图功能[转载]

用VC实现抓图功能[转载] 常常需要将屏幕图像或程序图形保存成图像格式,对于不太熟悉设备上下文和DDB、DIB的新手来说,无疑是一个难题,下面给出简单实现抓图功能的两个函数,只要稍加改动就...

Java实现屏幕抓图,控制远程桌面

主要使用的是java.util.Robot类来捕获屏幕,可以实现对屏幕一个矩形区域的捕获,通过这个类,我们也可以实现一个远程桌面控制的程序。 package com.qiu.util; i...

使用DirectShow的BaseClasses遇到的问题

在学习DirectShow时,难免会跑跑
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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