用directshow 实现抓图遇到的问题

来源:互联网 发布:仿淘宝网站模板 编辑:程序博客网 时间:2024/04/28 15:36

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

原创粉丝点击