2013-05-01 2 views
2

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

var tempFileNamePath = Path.Combine(workingDirectory, fileName); 
Bitmap image = new Bitmap(tempFileNamePath); 
var newImage = (Bitmap)image.Clone(); 
image.Dispose(); 

newImage.EnhanceImage(); 
newImage.Save(tempFileNamePath, System.Drawing.Imaging.ImageFormat.Jpeg); 
newImage.Dispose(); 

Но это не удалось сохранить файл с ошибкой: общая ошибка происходит в GDI +

Любая мысль о том, почему тис происходит?

ответ

4

Bitmap.Clone() не делает то, что вы надеетесь. Это копия неглубокой, она по-прежнему использует пиксельные данные исходного изображения. Таким образом, удаление исходного изображения не освобождает блокировку файла.

Чтобы получить глубокой копии использовать Bitmap (Image) конструктор:

Bitmap newImage = null; 
using (var image = new Bitmap(tempFileNamePath)) { 
    newImage = new Bitmap(image); 
} 

переименование исходного файл будет дешевой альтернативой, которая использует меньше памяти, в пользу этого, когда изображение велико:

newImage.EnhanceImage(); 
var tmpname = tempFileNamePath + ".bak"; 
System.IO.File.Delete(tmpname); 
System.IO.File.Move(tempFileNamePath, tmpname); 
try { 
    newImage.Save(tempFileNamePath, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 
catch { 
    System.IO.File.Move(tmpname, tempFileNamePath); 
    throw; 
} 
finally { 
    newImage.Dispose(); 
} 
System.IO.File.Delete(tmpname); 
+0

Спасибо. Трюк переименования не работает, так как я хочу выполнить некоторую обработку изображений на изображениях, а затем сохранить их. – mans

Смежные вопросы