【问题标题】:C# Generic Error with GDI+ on Bitmap.SaveBitmap.Save 上 GDI+ 的 C# 通用错误
【发布时间】:2012-06-27 11:52:49
【问题描述】:
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();
}

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

【问题讨论】:

  • 你有异常吗?它是如何“不起作用”的?
  • 我确定这不是一般错误,而是包含可能有用的描述的错误 - 但您没有向我们提供该信息。
  • 它所说的只是“GDI+ 中发生一般错误”
  • 我相信围绕 GDI+ 的 .NET 包装器在错误细节上非常少。

标签: c# .net image file bitmap


【解决方案1】:

您是正确的,因为它已被您的程序锁定,因此您无法对其进行写入。位图类的 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");
    }

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      确实,看到这个异常可能有很多原因。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 2017-05-04
        • 2011-08-14
        • 1970-01-01
        • 2010-12-20
        相关资源
        最近更新 更多