Как вы используете ту же память из объекта в C #?(Точечный рисунок) - PullRequest
0 голосов
/ 11 февраля 2012

Я пишу простую программу изменения размера изображения. Перетаскивая несколько файлов на .exe, он будет проходить и изменять размер каждого файла. Это работает до определенного момента, когда генерируется исключение OOM (нехватка памяти). Я пытался вызвать Dispose для растрового изображения и установить его в Null, но ни один из них, похоже, ничего не делает.

Bitmap current_image;
for (int i = 0; i < imagesfilepath.Count; ++i)
        {
            // Load the image. 
            if ( current_image != Null )
            {
                current_image.Dispose();
                current_image = Null;
            }
            current_image = (Bitmap)Image.FromFile(imagesfilepath[i], true);

            // Resize it.
            // Save it.
        }

Исключение обычно выдается после использования 1,5 ГБ. Я могу обойти эту проблему, ограничив количество изображений, которые пользователь может изменить за один раз, но разве я не смогу просто выделить память для одного растрового изображения и использовать ее каждую итерацию?

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

Image.FromFile () создает исключение OutOfMemoryException, когда файл не является допустимым изображением:

Исключение Условие OutOfMemoryException
Файл не имеет допустимого формата изображения.-или- GDI + не поддерживает пиксельный формат файла.

Да, это не имеет смысла и сбивает с толку, но это то, что есть.

MSDN: Image.FromFile

1 голос
/ 24 февраля 2013

Недостаток памяти вызван сегментацией памяти, отсутствием непрерывного блока памяти требуемого размера.вам лучше использовать тот же буфер, чтобы избежать его.

0 голосов
/ 11 февраля 2012

Пока вы избавляетесь от изображений, вы не должны получать исключение OutOfMemoryException. Протестировано с использованием следующего фрагмента кода, где утилизация позволила программе успешно завершиться, но не утилизация вызвала исключение.

var path = @"C:\Users\mdearing\Desktop\Untitled.bmp";
for (var i = 0; i < 1000; i++)
{
    var image = Bitmap.FromFile(path);
    //image.Dispose(); //commenting this line out causes the OOM Exception
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...