bool CDXGraph::SnapshotBitmap(const char * outFile)
{ if (mBasicVideo)
{ long bitmapSize = 0;
HRESULT hr;
hr=mBasicVideo->GetCurrentImage(&bitmapSize, 0);
if ( hr )
{ bool pass = false;
unsigned char * buffer = new unsigned char[bitmapSize];
hr=mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer);

if ( hr )
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;//指向位图信息头结构 
BITMAPINFOHEADER bmpinfo; //位图信息头结构   
lpbi = (LPBITMAPINFOHEADER)buffer; int nColors = 1 << lpbi->biBitCount;
if (nColors > 256)
nColors = 0; hdr.bfType = ((WORD) ('M' << 8) | 'B'); //always is "BM"
hdr.bfSize = bitmapSize + sizeof( hdr );
hdr.bfReserved1  = 0;
hdr.bfReserved2  = 0;
hdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
nColors * sizeof(RGBQUAD)); bmpinfo.biSize = sizeof(bmpinfo); 
long height, width; 
mBasicVideo->get_VideoHeight(&height); 
mBasicVideo->get_VideoWidth(&width); 
bmpinfo.biWidth = width; 
bmpinfo.biHeight = height; 
bmpinfo.biPlanes = 1; 
bmpinfo.biBitCount =24; 
CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
bitmapFile.Write(&bmpinfo, sizeof(BITMAPINFOHEADER));
bitmapFile.Write(buffer, bitmapSize);
bitmapFile.Close(); pass = true;
}
delete [] buffer;
return pass;
}
}
return false;
}这个是陆其明老师的Directshow开发指南里播放器那个例子里的抓图函数,对于本地打开的视频抓图是可以用的,但是我打开摄像头抓图后,显示的图片都是没有预览,说是图片格式不对。
麻烦大家帮我看看哦