首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AForge相机内存泄漏

AForge相机内存泄漏
EN

Stack Overflow用户
提问于 2013-04-09 10:53:03
回答 4查看 3.9K关注 0票数 3

我正在用C#开发一个应用程序,我还开发了一个库,它可以使用Aforge摄像头完成一些工作。其中一个要点是简单地捕捉网络凸轮前面的图像,并在特定的PictureBox上显示出来:

代码语言:javascript
复制
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中。

我的疑问是:

在一些计算机中,这种绘画方式会产生很高的内存泄漏。摄像头的配置是:640x480,如果它更高,内存泄漏就会增加。

计算机配置:

Intel i5:内存泄漏到500 to

Intel i7:没有内存泄漏。

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

编辑:

代码语言:javascript
复制
    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;
    }

我不明白为什么有些电脑有内存泄漏而另一些没有.有什么建议吗?

注意:认为内存泄漏仅发生在Visual 2010的发布模式中,而不发生在调试上。

NOTE2: --我认为这是FromBimapImage带来的问题,因为我尝试了一个WindowsForms应用程序而不是WPF应用程序,而没有内存泄漏.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-09 19:30:41

AForge 拥有权图像的字节,您应该制作自己的副本。将框架传递给Bitmap构造函数是不够的。如果框架不能正确地释放位图,因为您有它的引用,那么就会有漏洞。

试着用这个:

代码语言:javascript
复制
private void NewFrame(object sender, NewFrameEventArgs args)
{
    Bitmap newFrame = AForge.Imaging.Image.Clone(args.Frame);
    PictureBox.FromBitmapImage(newFrame);
    newFrame.Dispose();
}
票数 3
EN

Stack Overflow用户

发布于 2014-09-09 23:41:20

这对我有用。

代码语言:javascript
复制
        if (pictureBox1.Image != null) {
            pictureBox1.Image.Dispose();
        }
        Bitmap bitmap = eventArgs.Frame.Clone() as Bitmap;
        pictureBox1.Image = bitmap;
票数 5
EN

Stack Overflow用户

发布于 2017-07-25 07:16:08

在分配新的图片之前正确地处理图片框图像可以防止内存泄漏,但是当我调整图片框的大小时会抛出错误。问题可能是因为处理图像太快了。它对我起作用的是将旧图像保留在队列中,并以延迟5张图像的方式处理它们。这将给画框足够的时间来赶上。

代码语言:javascript
复制
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();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15899970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档