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 へのポインターとして単純に渡したかったのですが、これを行う方法がわからなかったため、データをバイト バッファーにコピーしました。これによりパフォーマンスがわずかに低下するため、改善してより高いフレームレートを実現できる場合は、そうしたいと思います.