В 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 шт):
Подозреваю, что сохранить надо после уничтожения 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
должен сработать гарантированно.