1

C# で FileStream を介して Web カメラから取得した画像をファイルに書き込もうとしています。これらは 16 ビットのモノクロであるため、Bitmap オブジェクトをそのまま書き出すことはできません。これを回避するために、次のように Marshal.Copy() を使用しています。

        unsafe private void RecordingFrame()
    {
        Bitmap bm16;
        BitmapData bmd;
        Emgu.CV.Image<Gray, UInt16> currentFrame;
        const int ORIGIN_X = 0;
        const int ORIGIN_Y = 0;

        // get image here and put it in bm16...

        bmd = bm16.LockBits(new Rectangle(ORIGIN_X, ORIGIN_Y, bm16.Width, bm16.Height), 
                            ImageLockMode.ReadOnly, bm16.PixelFormat);

        var length = bmd.Stride * bmd.Height;
        byte[] bytes = new byte[length];
        Marshal.Copy(bmd.Scan0, bytes, 0, length);

        fsVideoWriter.Write(bytes, 0, length);
        bm16.UnlockBits(bmd);
    }

これはこれを達成するための最良の方法ですか?BitmapData の Scan0 メンバーを FileStream へのポインターとして単純に渡したかったのですが、これを行う方法がわからなかったため、データをバイト バッファーにコピーしました。これによりパフォーマンスがわずかに低下するため、改善してより高いフレームレートを実現できる場合は、そうしたいと思います.

4

1 に答える 1

1

bmd.Scan0 から UnmanagedMemoryStream を作成し、CopyTo(fsVideoWriter) を呼び出すことができます。しかし、これが現在のものよりも速くなるかどうかはわかりません。

于 2013-08-14T23:28:24.713 に答える