AForge相机内存泄漏(AForge camera memory leak)

2019-08-20 21:24发布

我正在开发的C#应用程序,我开发了做一些东西与库Aforge相机。 其中一点是简单地捕捉到了什么是在网络摄像头前的图像,并显示在一个特定的PictureBox可以这样做:

camera.NewFrame += NewFrame;

private void NewFrame(object sender, NewFrameEventArgs args)
    {
        Bitmap newFrame = new Bitmap(args.Frame);
        args.Frame.Dispose();
        PictureBox.FromBitmapImage(newFrame);
        newFrame.Dispose();
        newFrame = null;
    }

我做什么在这里,我得到的每一个帧,并将其绘制到PictureBox

我的疑问是:

在某些计算机,绘画这种方式产生了非常高的内存泄漏。 相机的配置是:640×480,并且如果它是较高的,内存泄漏增加。

电脑配置:

英特尔酷睿i5:内存泄漏为500MB

英特尔酷睿i7:没有内存泄漏。

双心(没那么强大):没有那么多内存泄漏。

编辑:

    public static void FromBitmapImage(this Image image, Bitmap bitmap)
    {
        BitmapImage bitmapImage = new BitmapImage();

        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, ImageFormat.Bmp);
            memoryStream.Position = 0;
            bitmapImage.BeginInit();
            bitmapImage.StreamSource = memoryStream;
            bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
            bitmapImage.EndInit();
        }

        image.Source = bitmapImage;
        bitmapImage = null;
    }

我不明白为什么我有一些电脑和其他人没有内存泄漏...任何建议吗?

注意:内存泄漏只在Release模式发生在Visual Studio 2010中,但不是在调试。

注2:我觉得这个问题自带FromBimapImage ,因为我尝试了WindowsForms应用程序,而不是一个WPF之一,没有内存泄漏...

Answer 1:

AForge 拥有图像的字节,你应该让自己的深层复制。 路过帧位图的构造是不够的。 如果因为你必须给它一个参考框架是不能够妥善处理位图,有一个泄漏。

试试这个:

private void NewFrame(object sender, NewFrameEventArgs args)
{
    Bitmap newFrame = AForge.Imaging.Image.Clone(args.Frame);
    PictureBox.FromBitmapImage(newFrame);
    newFrame.Dispose();
}


Answer 2:

这对我的作品。

        if (pictureBox1.Image != null) {
            pictureBox1.Image.Dispose();
        }
        Bitmap bitmap = eventArgs.Frame.Clone() as Bitmap;
        pictureBox1.Image = bitmap;


Answer 3:

处置图片框图像右侧前分配新的工作,以防止内存泄漏,但是当我调整了图片框扔错误。 也许这个问题是由于过早的图像处置。 什么它的工作对我来说是保持在队列中的旧图片,并与5个图像的延迟处理它们。 这会给图片框足够的时间来追赶。

private Queue<Image> _oldImages = new Queue<Image>();
...

if (pictureBox1.Image != null)
{
  _oldImages.Enqueue(pictureBox1.Image);
  if (_oldImages.Count > 5) 
  {
    var oldest = _oldImages.Dequeue();
    oldest.Dispose();
  }
}


文章来源: AForge camera memory leak