各位大大
當我在使用該函式的時候
發現每次存檔都會變成事32b的格式
附上SampleGrabberCallback .h
extern AM_MEDIA_TYPE g_StillMediaType;
class SampleGrabberCallback : public ISampleGrabberCB
{
public:
// Fake referance counting.
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 2; } STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject)
{
if (NULL == ppvObject) return E_POINTER;
if (riid == __uuidof(IUnknown))
{
*ppvObject = static_cast(this);
return S_OK;
}
if (riid == __uuidof(ISampleGrabberCB))
{
*ppvObject = static_cast(this);
return S_OK;
}
return E_NOTIMPL;
} STDMETHODIMP SampleCB(double Time, IMediaSample *pSample)
{
return E_NOTIMPL;
} STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen)
{
if ((g_StillMediaType.majortype != MEDIATYPE_Video) ||
(g_StillMediaType.formattype != FORMAT_VideoInfo) ||
(g_StillMediaType.cbFormat < sizeof(VIDEOINFOHEADER)) ||
(g_StillMediaType.pbFormat == NULL))
{
return VFW_E_INVALIDMEDIATYPE;
}
HANDLE hf = CreateFile("c.bmp", GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hf == INVALID_HANDLE_VALUE)
{
return E_FAIL;
} long cbBitmapInfoSize = g_StillMediaType.cbFormat - SIZE_PREHEADER;
VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)g_StillMediaType.pbFormat; // 建立 BMP 檔頭
BITMAPFILEHEADER bfh;
ZeroMemory(&bfh, sizeof(bfh));
bfh.bfType = 'BM'; // Little-endian for "MB".
bfh.bfSize = sizeof( bfh ) BufferLen cbBitmapInfoSize;
bfh.bfOffBits = sizeof( BITMAPFILEHEADER ) cbBitmapInfoSize;
// 寫入標頭檔
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL ); // 寫入 該 Frame 相關的 Bitmap Infomation Header
// HEADER 傳回 Video Header 中的 BITMAPINFOHEADER 位址
WriteFile(hf, HEADER(pVideoHeader), cbBitmapInfoSize, &dwWritten, NULL); // 寫入 frame 資料
WriteFile( hf, pBuffer, BufferLen, &dwWritten, NULL );
CloseHandle( hf );
return S_OK; }
};
然而我在進入CALLBACK之前有先看過
if(g_StillMediaType.subtype==MEDIASUBTYPE_RGB8){ShowMessage("RGB8");}
但是當進入SampleGrabberCallback後再查詢一次就變成RGB32了@@ 有無辦法可以改存也是存成RGB8的形式呢?