В GDI+ возникла ошибка общего вида при сохранении изображения

У меня возникает проблема при сохранении изображения при повторном вызове метода для обработки и сохранения изображения. Возникает только во второй раз, в первом случае все успешно сохраняется. Вроде даже обернул все в using, но почему то все равно нет доступа к изображению. Причем нужно именно перезаписать файл, а не сделать копию

using (var bmp = new Bitmap(450, 450))
using (var graphics = Graphics.FromImage(bmp))
{
    graphics.Clear(Color.AntiqueWhite);

    using (var pen = new Pen(Color.Black, 2))
    {
        graphics.DrawLine(pen, 100, 0, 100, 400);
        graphics.DrawRectangle(pen, 200, 50, 100, 100);
    }

    bmp.Save(_imageViewModel.ImageSource);
}
}

Пробовал так же работать с изображением через отдельный FileStream, все равно возникала та же проблема


Ответы (1 шт):

Автор решения: aepot

Подозреваю, что сохранить надо после уничтожения Graphics

using (var bmp = new Bitmap(450, 450))
{
    using (var graphics = Graphics.FromImage(bmp))
    {
        graphics.Clear(Color.AntiqueWhite);

        // ... рисование
    }
    bmp.Save(_imageViewModel.ImageSource);
}

Возможно при открытом Graphics где-то подвисают ресурсы.

using дожен обеспечивать 100% очистку ресурсов немедленно. Если это не происходит, значит где-то ресурсы придерживаете. Возможно за пределами показанного кода. Вы точно нигде в другом месте не читаете из этого файла?

Если читаете, то это надо делать как-то так

Bitmap bmp;
using (var buffer = (Bitmap)Image.FromFile(_imageViewModel.ImageSource))
{
    bmp = new Bitmap(buffer);
}

В этом случае при чтении Bitmap сразу же отпустит файл.

Альтернативно можно сохранять через буфер.

using (var bmp = new Bitmap(450, 450))
using (var ms = new MemoryStream())
{
    using (var graphics = Graphics.FromImage(bmp))
    {
        graphics.Clear(Color.AntiqueWhite);

        // ... рисование
    }
    bmp.Save(ms);
    ms.Position = 0;
    using (var fs = File.Create(_imageViewModel.ImageSource))
    {
        ms.CopyTo(fs);
    }
}

Тогда GDI+ ничего не узнает о файле и не захватит его. Но мне кажется, это лишнее, using должен сработать гарантированно.

→ Ссылка