Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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;
            }
        }