在Bitmap.Save上使用GDI +的C#通用错误

时间:2012-06-26 07:34:13

标签: c# .net image file bitmap

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

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

3 个答案:

答案 0 :(得分:1)

你是正确的,因为它被你的程序锁定,因此你不能写它。它在msdn页面上为Bitmap类解释(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");
    }

答案 1 :(得分:0)

我与你的情况并不完全相同,但是我的打开图像文件仍然存在问题。

一个建议是您使用BitmapCacheOption.OnLoad将图片加载到内存中,请参阅我对这篇文章的回答:Locked resources (image files) management

然后,在编辑之后,可以使用FileStream将该图像保存到同一文件中,例如:Save BitmapImage to File

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

答案 2 :(得分:0)

确实可能有很多理由看到这个例外。

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