0
public void EditAndSave(String fileName) {
    Bitmap b = new Bitmap(fileName);
    /**
    * Edit bitmap b... draw stuff on it...
    **/
    b.Save(fileName); //<---------Error right here
    b.Dispose();
}

我的代码与上面的代码类似。当我尝试保存刚刚打开的文件时,它不起作用。当我尝试用不同的路径保存它时,它工作正常。可能是该文件已在我的程序中打开,因此无法写入?我很困惑。

4

3 回答 3

1

您是正确的,因为它被您的程序锁定,因此您无法写入它。Bitmap 类的 msdn 页面 (http://msdn.microsoft.com/en-us/library/3135s427.aspx) 对此进行了解释。

解决这个问题的一种方法(从我的头顶来看,可能是更简单的方法)是首先将图像缓存在内存流中并从那里加载它,从而能够关闭文件锁。

    static void Main(string[] args)
    {
        MemoryStream ms = new MemoryStream();
        using(FileStream fs = new FileStream(@"I:\tmp.jpg", FileMode.Open))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            ms.Write(buffer, 0, buffer.Length);
        }

        Bitmap bitmap = new Bitmap(ms);

        // do stuff

        bitmap.Save(@"I:\tmp.jpg");
    }
于 2012-06-26T08:04:22.247 回答
0

我的情况与您的情况并不完全相同,但是我在打开的图像文件保持打开状态时遇到了问题。

一个建议是您使用 将图像加载到内存中BitmapCacheOption.OnLoad,请参阅我对这篇文章的回答:锁定资源(图像文件)管理

然后,在编辑之后,可以使用 FileStream 将该图像保存到同一个文件中,例如此处所述:将 BitmapImage 保存到文件

我不确定这是最简单或最优雅的方式,但我想它应该适合你。

于 2012-06-26T07:49:24.313 回答
0

事实上,看到这个例外可能有很多原因。

请注意,如果您使用PixelFormat.Format16bppGrayScale,则 GDI+ 不支持它,并且会以所示方式失败。似乎使用正确的 16 位灰度的唯一解决方法是使用System.Windows.MediaWPF 中较新的命名空间。

于 2012-10-17T11:51:21.000 回答