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