C# New bitmap() - Недостаточно памяти
Я новичок в программировании DotNet. У меня серьезная проблема, но я не знаю почему. Я уже пользовалась Dispose()
метод, но проблема "Недостаточно памяти" по-прежнему возникает. Примерно в первые 30 раз все работает отлично. Затем, Out of memory
случается. Кроме того, изображения с 13-16 МБ. Это мой код:
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 ответа
Попробуйте предложение в их документации.
Время, когда сборщик мусора решает утилизировать изображение, не гарантируется. При работе с большим изображением рекомендуется вызывать метод Dispose() для явного освобождения объекта. Или используйте ключевое слово using в C#, чтобы ограничить область изображения.
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();
Я хотел бы предложить вам прочитать об этом, прежде чем использовать его здесь.
Это может быть неприменимо больше, но была некоторая версия CLR, в которой определенно были ошибки с LOH, где изображения обычно выделялись. Возможно, хочу проверить эту тему. Обходным решением было вручную проверить, достаточно ли согласованной памяти (для выделения внешней памяти) перед распределением, что является небольшой проблемой в C#. Просто предположить, что вы не можете сделать что-то не так.
У меня также были проблемы с использованием OpenCV/Emgu и я использовал opencvsharp для некоторых проблем. Это более прямая оболочка, в которой вы должны быть очень осторожны с распределением памяти. Прошло уже некоторое время, и я не могу вспомнить проблему exaxt. Это было связано с распределением памяти. Думаю, это должно быть исправлено.
Закончилось наличием и того и другого в качестве зависимости, и это не помогает иметь чистый код.
В противном случае, попробуйте использовать оператор using, который предлагают другие ответы. Он вызывает.Dispose() автоматически и сразу запускает GC. Таким образом, ваша память не так сильно фрагментируется. Вы также можете написать..
using(Image a, Image b, Image c, ...) {}
... до тех пор, пока объект реализует IDisposable