在我的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 ...”则没有泄漏。
答案 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);.另外,看看你是否可以安全克隆()它。 - 吉米