来自Accord VideoCaptureDevice的事件回调中的连续内存泄漏

时间:2018-05-08 00:13:07

标签: c# .net image image-processing bitmap

在我的Accord VideoCaptureDevice的事件回调中,我的USB相机的每个帧图像位图都出现了严重的严重泄漏。

初​​始化:

public static Bitmap latest_frame_buffer_Bitmap = null;                 
// latest camera frame FOV (complete Field Of View) bitmap

事件:

private static void EVENT_camera_frame(object sender, NewFrameEventArgs camera_frame_event)
{
    if( latest_frame_buffer_Bitmap != null )
    {
        latest_frame_buffer_Bitmap.Dispose();
    }

    latest_frame_buffer_Bitmap = rotation_filter.Apply(new Bitmap(camera_frame_Bitmap.Width, camera_frame_Bitmap.Height, PixelFormat.Format24bppRgb));
 }

如果我注释掉“latest_frame_buffer_Bitmap = rotation_filter ...”则没有泄漏。

1 个答案:

答案 0 :(得分:0)

我按照主人的这些伟大建议修复了它......

在工作线程上引发NewFrame事件。但是在UI线程上引发了Paint事件。您不能使用Clone(),您必须进行深层复制。使用新的Bitmap(Image)构造函数。您也无法在工作线程中安全地分配PictureBox.Image属性,您必须使用其BeginInvoke()方法来确保在UI线程上进行分配。 - Hans Passant 4月16日21:48

除了汉斯所说的,尝试复制NewFrame Handler返回的Bitmap,更改Bitmap camera_frame_Bitmap = camera_frame_event.Frame; to Bitmap camera_frame_Bitmap = new Bitmap(camera_frame_event.Frame);.另外,看看你是否可以安全克隆()它。 - 吉米