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

Другие вопросы по тегам