64,683
社区成员
发帖
与我相关
我的任务
分享
bool CDXGraph::SnapshotBitmap(const char * outFile)
{
if (mBasicVideo)
{
long bitmapSize = 0;
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
{
bool pass = false;
unsigned char * buffer = new unsigned char[bitmapSize];
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)buffer;
unsigned __int64 nColors = (unsigned __int64 )1 << lpbi->biBitCount;
if (nColors > 256 || 32 == lpbi->biBitCount)
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));
CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
bitmapFile.Write(buffer, bitmapSize);
bitmapFile.Close();
ofstream bmpFile(outFile, ios::in | ios::out | ios::binary);
pass = true;
}
delete [] buffer;
return pass;
}
}
return false;
}
[code=C/C++]CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
bitmapFile.Write(buffer, bitmapSize);
bitmapFile.Close();
[/code]ofstream bmpFile(outFile, ios::in | ios::out | ios::binary);
bmpFile.write((char*)&hdr, sizeof(BITMAPFILEHEADER));
bmpFile.write((char*)buffer, bitmapSize);
bmpFile.close();
char szTemp[] = "C:\\mysnapshot.bmp";
if (mFilterGraph->SnapshotBitmap(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(), FALSE);
::DeleteFile(szTemp);
}
}