我正在尝试打开位图文件,然后更改并保存,但我收到了一些错误。代码如下:
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 +中发生了一般错误
想到为什么会发生这种情况?
答案 0 :(得分: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);