为什么我用DirectX Show抓图有时会抓张空图? 我近来写了个摄像头的抓图程序,在许多机器上都能运行正常,可是有两台电脑不能抓图,生成的图片一片空白。真不知道是为什么? 请大家想想原因及解决办法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用的抓图方法是继承ISampleGrabberCB,重写BufferCB()函数。代码如下:STDMETHODIMP SampleGrabberCallback::BufferCB(double Time, BYTE *pBuffer, long BufferLen){ if (! m_bOneShot) return VFW_E_INVALIDMEDIATYPE; HANDLE hf = CreateFile(m_szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL); if (hf == INVALID_HANDLE_VALUE) { m_bOneShot = false; return E_FAIL; } long cbBitmapInfoSize = m_StillMediaType.cbFormat - SIZE_PREHEADER; VIDEOINFOHEADER *pVideoHeader =(VIDEOINFOHEADER*)m_StillMediaType.pbFormat; BITMAPFILEHEADER bfh; ZeroMemory(&bfh, sizeof(bfh)); bfh.bfType = 'MB'; // Little-endian for "MB". bfh.bfSize = sizeof( bfh ) + BufferLen + cbBitmapInfoSize; bfh.bfOffBits = sizeof( BITMAPFILEHEADER ) + cbBitmapInfoSize; // Write the file header. DWORD dwWritten = 0; WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL ); WriteFile(hf, HEADER(pVideoHeader), cbBitmapInfoSize, &dwWritten, NULL); WriteFile( hf, pBuffer, BufferLen, &dwWritten, NULL ); CloseHandle( hf ); m_bOneShot = false; return S_OK;} STDMETHODIMP BufferCB( double SampleTime, BYTE * pBuffer, long BufferSize ) { // // Convert the buffer into a bitmap // TCHAR szFilename[MAX_PATH]; wsprintf(szFilename, TEXT("Bitmap%5.5ld.bmp\0"), long( SampleTime * 1000 ) ); // Create a file to hold the bitmap HANDLE hf = CreateFile(szFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL ); if( hf == INVALID_HANDLE_VALUE ) { return 0; } _tprintf(TEXT("Found a sample at time %ld ms\t[%s]\r\n"), long( SampleTime * 1000 ), szFilename ); // Write out the file header // BITMAPFILEHEADER bfh; memset( &bfh, 0, sizeof( bfh ) ); bfh.bfType = 'MB'; bfh.bfSize = sizeof( bfh ) + BufferSize + 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 = Width; bih.biHeight = Height; bih.biPlanes = 1; bih.biBitCount = 24; Written = 0; WriteFile( hf, &bih, sizeof( bih ), &Written, NULL ); // Write the bitmap bits // Written = 0; WriteFile( hf, pBuffer, BufferSize, &Written, NULL ); CloseHandle( hf ); return 0; }你的BMP图是几位的?参考一下例子吧! 谢谢大家了!在调试中发现函数传的参数pBuffer里的内容不正确。这是怎么回事呢? ffmpeg改变帧率//怎么不行,是改pFormatCtx中r_frame_rate吗??? [ NetUserGetGroups返回值为2221 怎样固定程序运行的名称? 关于怎么把一个命令行的结果重定向到一个文件中的问题。 >>>>>>>>>>>>>>~~~简单问题,高手拿分`~~~<<<<<<<<<<<<<<<<< 用chart控件画动态曲线时,如何处理屏幕闪动的问题? 设置网络打印机的状态 isspace 中的问题: 请教VC++下声道控制函数,急用 这个函数声明是什么意思啊? TCP/IP协议的实质 CStatic 绘图问题
代码如下:
STDMETHODIMP SampleGrabberCallback::BufferCB(double Time, BYTE *pBuffer, long BufferLen)
{
if (! m_bOneShot) return VFW_E_INVALIDMEDIATYPE; HANDLE hf = CreateFile(m_szFileName, GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hf == INVALID_HANDLE_VALUE)
{
m_bOneShot = false;
return E_FAIL;
}
long cbBitmapInfoSize = m_StillMediaType.cbFormat - SIZE_PREHEADER;
VIDEOINFOHEADER *pVideoHeader =(VIDEOINFOHEADER*)m_StillMediaType.pbFormat; BITMAPFILEHEADER bfh;
ZeroMemory(&bfh, sizeof(bfh));
bfh.bfType = 'MB'; // Little-endian for "MB".
bfh.bfSize = sizeof( bfh ) + BufferLen + cbBitmapInfoSize;
bfh.bfOffBits = sizeof( BITMAPFILEHEADER ) + cbBitmapInfoSize;
// Write the file header.
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
WriteFile(hf, HEADER(pVideoHeader), cbBitmapInfoSize, &dwWritten, NULL);
WriteFile( hf, pBuffer, BufferLen, &dwWritten, NULL );
CloseHandle( hf ); m_bOneShot = false;
return S_OK;
}
{
//
// Convert the buffer into a bitmap
//
TCHAR szFilename[MAX_PATH];
wsprintf(szFilename, TEXT("Bitmap%5.5ld.bmp\0"), long( SampleTime * 1000 ) ); // Create a file to hold the bitmap
HANDLE hf = CreateFile(szFilename, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, NULL, NULL ); if( hf == INVALID_HANDLE_VALUE )
{
return 0;
} _tprintf(TEXT("Found a sample at time %ld ms\t[%s]\r\n"),
long( SampleTime * 1000 ), szFilename ); // Write out the file header
//
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + BufferSize + 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 = Width;
bih.biHeight = Height;
bih.biPlanes = 1;
bih.biBitCount = 24; Written = 0;
WriteFile( hf, &bih, sizeof( bih ), &Written, NULL ); // Write the bitmap bits
//
Written = 0;
WriteFile( hf, pBuffer, BufferSize, &Written, NULL ); CloseHandle( hf ); return 0;
}你的BMP图是几位的?
参考一下例子吧!
在调试中发现函数传的参数pBuffer里的内容不正确。
这是怎么回事呢?