我正在尝试从C#中的AForge.Net捕获网络摄像头帧。不幸的是,我在_CurrentFrame.LockBits上得到了一个ArgumentException。我想我的事件写入锁定的位图有问题!?有时我也会在UnlockBits上得到“GDI +中发生一般错误”。
public bool GetFrame(ref Draw.STexture Frame)
{
BitmapData bd = _CurrentFrame.LockBits(new Rectangle(0, 0, _CurrentFrame.Width, _CurrentFrame.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
byte[] data = new byte[4 * _CurrentFrame.Width * _CurrentFrame.Height];
Marshal.Copy(bd.Scan0, data, 0, data.Length);
//Do something with data here
_CurrentFrame.UnlockBits(bd);
_CurrentFrame.Dispose();
}
private void OnFrame(object sender, NewFrameEventArgs e)
{
if (_CurrentFrame != null)
_CurrentFrame.Dispose();
_CurrentFrame = (Bitmap)e.Frame.Clone();
}
答案 0 :(得分:0)
Bitmap.Clone()方法很危险,它会创建位图的浅表副本。该副本将指针存储到像素数据而不是复制像素。在大多数相机驱动程序中,该指针仅在回调(事件)运行时有效。如果您稍后尝试使用它,那么您将访问无效的像素数据,很可能在LockBits上发生异常。
在事件运行时执行处理,或使用Bitmap(Image)构造函数创建深层副本。当然,这份副本往往很昂贵。