我是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();
}
答案 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