将未更改的图像保存到从中读取的文件

Saving an unchanged Image to the file it was read from

我使用 System.Drawing.Image.FromFile(filePath) 将 .PNG 图像文件读入 Image 变量,以便在弹出对话框中显示。用户可能会使用对话框中的控件修改该图像,当他们单击“确定”按钮关闭对话框时,当前状态的图像将写回到最初通过调用 Image.Save(filePath, format) 读取的文件中。

如果他们修改图像,这会很好用。例如,他们可能会旋转图像,对此我称之为 Image.RotateFlip().

但是,如果他们不修改图像,这 不会 起作用,即当弹出窗口出现时,他们做的第一件事就是单击“确定”按钮。这导致 "generic GDI+ error".

Google 结果让我相信在修改图像数据之前,原始文件上的某种锁定一直被保留。修改图片前调用Image.Save()与锁冲突,修改后调用可以,因为没有锁了

不幸的是,我无法找到关于我的确切问题的任何其他报告。所以我想知道:为什么我不能将 Image 保存到它被读取的文件中,除非我修改它?

解决这个问题最直接的方法是在Image加载后立即对Image进行一些不可检测的修改(例如旋转360度)。但这是非常骇人听闻的。

我会检查 Image 是否已被编辑,除非已执行编辑,否则不会保存它,但除了使用布尔标志并将其设置在修改图像的任何代码中。但这有点脆弱,因为将来添加图像修改代码的任何人都需要知道在他们的代码中设置此标志。

最后,我的问题是:解决这个问题的最佳方法是什么?

是的。使用 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;
    }
}