我正在尝试通过C#中的FileStream将从网络摄像头获取的图像写入文件。它们是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的指针传递,但我无法弄清楚如何执行此操作,因此我将数据复制到字节缓冲区中。这会略微降低性能,所以如果我可以改进它以实现更高的帧速率,我愿意这样做。
答案 0 :(得分:1)
您可以从bmd.Scan0创建UnmanagedMemoryStream,然后调用CopyTo(fsVideoWriter)。但我不确定这是否会比你现在拥有的更快。