GetBitmapFromSampleGrabberBufferMain(DirectShow.ISampleGrabber i_grabber, int width, int height, int stride) { // サンプルグラバから画像を取得するためには // まずサイズ0でGetCurrentBufferを呼び出しバッファサイズを取得し // バッファ確保して再度GetCurrentBufferを呼び出す。 // 取得した画像は逆になっているので反転させる必要がある。 var sz = 0; i_grabber.GetCurrentBuffer(ref sz, IntPtr.Zero); // IntPtr.Zeroで呼び出してバッファサイズ取得 if (sz == 0) { return(null); } // メモリ確保し画像データ取得 var ptr = Marshal.AllocCoTaskMem(sz); i_grabber.GetCurrentBuffer(ref sz, ptr); // 画像データをbyte配列に入れなおす var data = new byte[sz]; Marshal.Copy(ptr, data, 0, sz); // 画像を作成 var result = BufferToBitmap(data, width, height, stride); Marshal.FreeCoTaskMem(ptr); return(result); }
private Func <Bitmap> GetBitmapFromSampleGrabberCallback(DirectShow.ISampleGrabber i_grabber, int width, int height, int stride) { var sampler = new SampleGrabberCallback(); i_grabber.SetCallback(sampler, 1); // WhichMethodToCallback = BufferCB return(() => sampler.GetBitmap(width, height, stride)); }
GetBitmapFromSampleGrabberBuffer(DirectShow.ISampleGrabber i_grabber, int width, int height, int stride) { try { return(GetBitmapFromSampleGrabberBufferMain(i_grabber, width, height, stride)); } catch (COMException ex) { const uint VFW_E_WRONG_STATE = 0x80040227; if ((uint)ex.ErrorCode == VFW_E_WRONG_STATE) { // image data is not ready yet. return empty bitmap. return(EmptyBitmap(width, height)); } throw; } }