C#新位图() - 内存不足

时间:2017-08-18 09:02:02

标签: c# bitmap out-of-memory emgucv dispose

我是DotNet节目的新手。我遇到了一个严重的问题,但我不知道为什么。我已经使用了Dispose()方法,但是#34;内存不足"问题仍然存在。大约前30次,一切都很完美。然后,Out of memory发生了。此外,图像是13-16Mb。这是我的代码:

private void advanBtn_Click(object sender, EventArgs e)
{
    InvertFunction();
}

private void InverFunction()
{
    Bitmap bm = new Bitmap(imgBox.Image); // Out of memory
    Image<Gray, byte> EmguImage = new Image<Gray, byte>(bm);
    EmguImage = EmguImage.Not();
    imgBox.Image.Dispose();
    imgBox.Image = EmguImage.Bitmap;
    bm.Dispose();
    EmguImage.Dispose();
}

2 个答案:

答案 0 :(得分:2)

尝试documentation中的建议。

  

垃圾收集器决定处理图像的时间不是   保证。使用大图像时,建议拨打电话   Dispose()方法显式释放对象。或者,使用   C#中的using关键字用于限制图像的范围

    using (Bitmap bm = new Bitmap(imgBox.Image))
    {
        using (Image<Gray, Single> image = new Image<Gray, Single>(bm))
        {
            EmguImage = EmguImage.Not();
            imgBox.Image.Dispose();
            imgBox.Image = EmguImage.Bitmap;
        }
    }

作为最后的手段,您可以尝试强制垃圾收集。但这不是推荐的,只有在没有其他办法时才能使用。

  GC.Collect();

我建议你在使用here之前阅读它。

答案 1 :(得分:1)

它可能不再适用,但有一些版本的CLR肯定有LOH的错误,其中图像通常被分配。可能想检查该主题。解决方法是在分配之前手动检查是否有足够的连贯内存(用于外部内存分配),这在C#中有点痛苦。只是暗示你可能不会做错事。

我也遇到过使用OpenCV / Emgu的问题,并使用opencvsharp来解决一些问题。它是一个更直接的包装器,你必须非常小心内存分配。已经有一段时间了,我无法真正记住exaxt问题。它与内存分配有关。现在我想也应该修复它。

结束了将两者作为依赖项,并且它对于使用干净的代码没有帮助。

否则,尝试使用其他答案所暗示的using语句。它会自动调用.Dispose()并立即启动GC。这样,你的记忆不会碎片化。你也可以写..

using(Image a, Image b, Image c, ...) {}

...只要对象实现IDisposable