2012-07-02 1 views
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(); 
} 

답변

0

Bitmap.Clone() 메서드는 위험하므로 비트 맵의 ​​얕은 복사본을 만듭니다. 이 복사본은 픽셀을 복사하는 대신 픽셀 데이터에 대한 포인터를 저장합니다. 대부분의 카메라 드라이버에서 해당 포인터는 콜백 (이벤트)이 실행되는 동안에 만 유효합니다. 나중에 사용하려고하면 유효하지 않은 픽셀 데이터에 액세스하게되므로 LockBits에 대한 예외가 발생할 가능성이 큽니다.

처리 중에 이벤트가 실행되거나 비트 맵 (이미지) 생성자를 사용하여 딥 복사본을 만듭니다. 그 사본은 물론 비싼 경향이 있습니다.