2015-08-05 1 views
0

Я использую System.Drawing.Image.FromFile(filePath) для чтения файла изображения .PNG в переменную Image для отображения во всплывающем диалоговом окне. Пользователь может изменить это изображение с помощью элементов управления в диалоговом окне, и когда они нажмут кнопку «ОК», чтобы закрыть диалог, изображение в его текущем состоянии будет записано обратно в файл, из которого он был первоначально прочитан, вызвав Image.Save(filePath, format).Сохранение неизмененного изображения в файл, который был прочитан с

Это прекрасно работает, если они изменяют изображение. Например, они могут вращать изображение, для которого я звоню Image.RotateFlip().

Однако не работает, если они не изменяют изображение, то есть первое, что они делают, когда появляется всплывающее окно, нажмите кнопку «ОК». Это приводит к «общей ошибке GDI +».

Результаты Google заставляют меня поверить, что какая-то блокировка исходного файла сохраняется до тех пор, пока данные изображения не будут изменены. Вызов Image.Save() перед изменением изображения конфликтует с блокировкой, но вызывает его после модификации, потому что больше нет блокировки.

К сожалению, у меня возникли проблемы с поиском любых других сообщений о моей конкретной проблеме. Поэтому мне интересно: почему я не могу сохранить Image в файл, который был прочитан, если я не изменю его?

Наиболее прямым решением этой проблемы является выполнение некоторой необнаруживаемой модификации на Image (например, поворот на 360 градусов) сразу после ее загрузки. Но это ужасно хаки.

Я бы посмотрел, был ли отредактирован Image и просто не сохранил его, если не было выполнено редактирование, но, похоже, нет простого способа сделать это, не используя булевский флаг и его установку в любом коде, который изменяет изображение. Но это немного хрупко, поскольку любой, кто добавит код изменения изображения в будущем, должен знать, чтобы установить этот флаг в свой код.

В конечном счете, мой вопрос: что является лучшим способом решения этой проблемы?

ответ

2

Да. Сделайте глубокую копию изображения с помощью конструктора Bitmap (Image) и удалите изображение, чтобы блокировка файла никогда не вызывала проблем. Пример:

public static Bitmap LoadImageNoLock(string filePath) { 
    using (var img = Image.FromFile(filePath)) { 
     var bmp = new Bitmap(img); 
     bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution); 
     return bmp; 
    } 
} 
Смежные вопросы