1,451
社区成员
发帖
与我相关
我的任务
分享
BOOL CCaptureClass::MyCapture(CString MyFileName)
{
HRESULT hr;
AM_MEDIA_TYPE mediaType;
hr = pGrabber->GetConnectedMediaType(&mediaType);
if (FAILED(hr)) return hr;
VIDEOINFOHEADER *pVih;
if (mediaType.formattype == FORMAT_VideoInfo &&
(mediaType.cbFormat >= sizeof(VIDEOINFOHEADER)) &&
mediaType.pbFormat != NULL)
{
pVih = (VIDEOINFOHEADER *)mediaType.pbFormat;
}
else
return VFW_E_INVALIDMEDIATYPE;
if (SUCCEEDED(pGrabber->SetBufferSamples(TRUE)) ) // 设置为缓冲形式)
{
long cbBuffer = 0;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);
BYTE *pBuffer = new BYTE[cbBuffer];
if (!pBuffer) return -1;
// 获取一帧媒体的数据
hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long *)pBuffer);
if (FAILED(hr)) return hr;
HANDLE hf = CreateFile(MyFileName, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, NULL, NULL );
if( hf == INVALID_HANDLE_VALUE ){
MessageBox(NULL, _T("Create bmp file failure!"), _T(""), MB_OK|MB_ICONINFORMATION);
return 0;
}
///
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + cbBuffer + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD Written = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &Written, NULL );
// Write the bitmap format
//文件头
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
bih.biWidth = pVih->bmiHeader.biWidth;
bih.biHeight = pVih->bmiHeader.biHeight;
bih.biPlanes = 1;
bih.biBitCount = 24;
Written = 0;
WriteFile( hf, &bih, sizeof( bih ), &Written, NULL );
// Write the bitmap bits
//
Written = 0;
WriteFile( hf, pBuffer, cbBuffer, &Written, NULL );
CloseHandle( hf );
delete pBuffer;
// MessageBox(NULL, _T("保存图像成功!"), _T("保存图像提示"), MB_OK|MB_ICONINFORMATION);
}
pGrabber->SetOneShot(FALSE);
pGrabber->SetBufferSamples(FALSE);
FreeMediaType(mediaType);
return 0;
}
BOOL CCaptureClass::MyCapture(CString MyFileName)
{
HRESULT hr;
AM_MEDIA_TYPE mediaType;
hr = pGrabber->GetConnectedMediaType(&mediaType);
if (FAILED(hr)) return hr;
VIDEOINFOHEADER *pVih;
if (mediaType.formattype == FORMAT_VideoInfo &&
(mediaType.cbFormat >= sizeof(VIDEOINFOHEADER)) &&
mediaType.pbFormat != NULL)
{
pVih = (VIDEOINFOHEADER *)mediaType.pbFormat;
}
else
return VFW_E_INVALIDMEDIATYPE;
if (SUCCEEDED(pGrabber->SetBufferSamples(TRUE)) ) // 设置为缓冲形式)
{
long cbBuffer = 0;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);
BYTE *pBuffer = new BYTE[cbBuffer];
if (!pBuffer) return -1;
// 获取一帧媒体的数据
hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long *)pBuffer);
if (FAILED(hr)) return hr;
HANDLE hf = CreateFile(MyFileName, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, NULL, NULL );
if( hf == INVALID_HANDLE_VALUE ){
MessageBox(NULL, _T("Create bmp file failure!"), _T(""), MB_OK|MB_ICONINFORMATION);
return 0;
}
///
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + cbBuffer + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD Written = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &Written, NULL );
// Write the bitmap format
//文件头
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
bih.biWidth = pVih->bmiHeader.biWidth;
bih.biHeight = pVih->bmiHeader.biHeight;
bih.biPlanes = 1;
bih.biBitCount = 24;
Written = 0;
WriteFile( hf, &bih, sizeof( bih ), &Written, NULL );
// Write the bitmap bits
//
Written = 0;
WriteFile( hf, pBuffer, cbBuffer, &Written, NULL );
CloseHandle( hf );
delete pBuffer;
// MessageBox(NULL, _T("保存图像成功!"), _T("保存图像提示"), MB_OK|MB_ICONINFORMATION);
}
pGrabber->SetOneShot(FALSE);
pGrabber->SetBufferSamples(FALSE);
FreeMediaType(mediaType);
return 0;
}
这是我用来保存图像数据 的。你可以参考下。上面的pBuffer就是你想要的。可以直接发了。当然,你可以自己想办法压缩下