C# 如何打开位图文件,更改它,然后保存它?

C# 如何打开位图文件,更改它,然后保存它?,c#,image,gdi+,C#,Image,Gdi+,我试图打开一个位图文件,然后更改并保存它,但我得到一些错误。代码如下: var tempFileNamePath = Path.Combine(workingDirectory, fileName); Bitmap image = new Bitmap(tempFileNamePath); var newImage = (Bitmap)image.Clone(); image.Dispose(); newImage.EnhanceImage(); newImage.Save(tempFileN

我试图打开一个位图文件,然后更改并保存它,但我得到一些错误。代码如下:

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中发生了一个通用错误+

你知道为什么会这样吗

Bitmap.Clone()无法实现您希望的功能。这是一个浅拷贝,它仍然使用原始图像的像素数据。因此,处理原始图像不会释放对文件的锁定

要获取深度副本,请使用位图(图像)构造函数:

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);
Bitmap.Clone()的功能与您希望的不同。这是一个浅拷贝,它仍然使用原始图像的像素数据。因此,处理原始图像不会释放对文件的锁定

要获取深度副本,请使用位图(图像)构造函数:

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);

谢谢重命名技巧不起作用,因为我想对图像进行一些图像处理,然后保存它们。谢谢。重命名技巧不起作用,因为我想对图像进行一些图像处理,然后保存它们。