带有相机图像的位图访问冲突异常

Bitmap access violation exception with camera image

在我的 WPF 应用程序中,图像是用相机使用视图拍摄的,然后在通过 eventargs 关闭时作为位图传递给另一个。但是,当我随后尝试处理图像时,我得到了 AccessViolationException。当我在传递图像之前处理图像或使用从文件加载的图像时,不会发生这种情况。

从相机获取图像(PtCamera class 是我对 API Camera class 的包装)

 Bitmap GetRefImage(PtCamera cam)
    {

        Bitmap image = new Bitmap(2560, 1920, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        if (cam.IsConnected)
        {
           cam.FetchImage(out image);
        }
        else
        {
           ErrorOccurred?.Invoke(this, $"GetRefImage: {cam.Error}");
        }
        
        return image;
    }

在这种情况下,我可以访问位图并按我喜欢的方式处理它。

视图关闭时传递位图后:

void CloseZoomedView(bool isConf)
    {
        if (cam is object && cam.IsConnected)
            cam.Close();
        ZoomClosingArgs eArg = new ZoomClosingArgs()
        {
            IsConfirmed = isConf,
            RefImage = refImage,
        };
        ClosingZoom?.Invoke(this, eArg);
    }

访问其他viewmodel中的数据时直接出现异常:

void HandleZoomImageClosed(object sender, ZoomClosingArgs e)
{
    if (e is object && e.IsConfirmed)
    {
        Color test = e.RefImage.GetPixel(0, 0);
        //...
    }
 }

位图是通过FetchImage()

访问相机内存生成的
   public void FetchImage(out Bitmap image)
   {
      camera.Memory.GetActive(out int memID);
      camera.Memory.ToBitmap(memID, out image);
   }

如果我用文件

中的新位图替换FetchImage()中的代码
image = new Bitmap(@"d:\testimage.png")

它在任何情况下都可以正常工作。

API 文档简单地说明了以下内容:

Accessible

Camera.Memory.ToBitmap

Syntax

uEye.Memory.ToBitmap(int s32MemId, out System.Drawing.Bitmap bitmap)

Description

Returns a bitmap which contains the image. The method uses the already allocated image memory and the image is displayed in the format you specified when allocating the image memory.

非常感谢任何提示。

我过早关闭了相机对象。在CloseZoomedView()中,cam.Close()方法释放了相机占用的所有内存区域。在关闭之前传递一个新的位图就像一个魅力。

void CloseZoomedView(bool isConf)
{        
     ZoomClosingArgs eArg = new ZoomClosingArgs()
     {
        IsConfirmed = isConf,
        RefImage = new Bitmap(refImage),
     };
     
     if (cam is object && cam.IsConnected)
        cam.Close();

     ClosingZoom?.Invoke(this, eArg);
 }