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

1 回答 1

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);
于 2013-05-01T12:47:20.697 回答