SampleGrabberCB.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "StdAfx.h"
  2. #include "SampleGrabberCB.h"
  3. BOOL bOneShot = FALSE;
  4. CSampleGrabberCB mCB;
  5. CSampleGrabberCB::CSampleGrabberCB(void)
  6. {
  7. _tcscpy_s(m_szFileName, _T("c:\\donaldo.bmp"));
  8. }
  9. CSampleGrabberCB::~CSampleGrabberCB(void)
  10. {
  11. }
  12. STDMETHODIMP CSampleGrabberCB::BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
  13. {
  14. if( !bOneShot )
  15. return 0;
  16. if (!pBuffer)
  17. return E_POINTER;
  18. SaveBitmap(pBuffer, lBufferSize);
  19. bOneShot = FALSE;
  20. return 0;
  21. }
  22. //创建位图文件
  23. BOOL CSampleGrabberCB::SaveBitmap(BYTE * pBuffer, long lBufferSize )
  24. {
  25. HANDLE hf = CreateFile(
  26. m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
  27. CREATE_ALWAYS, NULL, NULL );
  28. if( hf == INVALID_HANDLE_VALUE )return 0;
  29. // 写文件头
  30. BITMAPFILEHEADER bfh;
  31. memset( &bfh, 0, sizeof( bfh ) );
  32. bfh.bfType = 'MB';
  33. bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
  34. bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
  35. DWORD dwWritten = 0;
  36. WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
  37. // 写位图格式
  38. BITMAPINFOHEADER bih;
  39. memset( &bih, 0, sizeof( bih ) );
  40. bih.biSize = sizeof( bih );
  41. bih.biWidth = lWidth;
  42. bih.biHeight = lHeight;
  43. bih.biPlanes = 1;
  44. bih.biBitCount = 24;
  45. WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
  46. // 写位图数据
  47. WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
  48. CloseHandle( hf );
  49. return 0;
  50. }