0

我正在尝试从 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();
}
4

1 回答 1

0

Bitmap.Clone() 方法很危险,它会创建位图的浅表副本。该副本存储指向像素数据的指针,而不是复制像素。在大多数相机驱动程序中,该指针仅在回调(事件)运行时才有效。如果您稍后尝试使用它,那么您将访问无效的像素数据,很可能会在 LockBits 上出现异常。

事件运行时进行处理或使用 Bitmap(Image) 构造函数创建深层副本。当然,该副本往往很昂贵。

于 2012-07-02T15:21:11.820 回答