带有相机图像的位图访问冲突异常
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);
}
在我的 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);
}