使用SaveFileDialog后,在Bitmap.Save()的GDI +上发生一般错误

Dul*_*ttu 27 c# bitmap save savefiledialog

我在using块中使用了以下代码块和更多代码:

using (System.Drawing.Bitmap tempImg =
       (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
    // ...
    tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);                            
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但我仍然得到错误:

GDI +发生了一般错误

只有在我做了一些与使用块内的代码无关的动作之后.在其他时候,这很好.tempImg.bmp也是一个临时文件,因此我删除了using块本身中的tempImg.bmp.

由于tempImg在使用中并且它被处理掉了,我认为应该解决锁定问题.

有人可以让我知道这段代码中的错误是什么?

编辑: System.Drawing.ImageSystem.Drawing.Bitmap为一体的类型tempImg.

编辑: 我发现只有在创建了SaveFileDialog并且用户点击"保存"后才会出现此错误.

Dul*_*ttu 40

最后,我可以在我的代码中找到错误,并想在此提及它,因为我认为它可能对某些人有用....

由于我在tempImg.Save中给出了一个相对路径,并且在用户点击SaveFileDialog中的"Save"之后,tempImg.Save的实际路径变为:

SaveFileDialog指定的路径+相对路径

自动.

因此,如果路径不存在,则会发生此错误.

感谢每一个人的答案.

  • 我忘了确保我的目录存在,并得到同样的错误.感谢分享! (4认同)

Eli*_*kiy 20

我也遇到过这个问题 - 它发生的原因是因为位图锁定而你无法保存它(如果你想我能找到确切的解释)所以无论如何解决这个问题:创建一个原始位图大小的新位图你将原始位图复制到新创建的位图,然后处理原始位图并保存新位图.

Bitmap bm3 = new Bitmap(bm2);
Run Code Online (Sandbox Code Playgroud)

然后保存.


Dre*_*rsh 5

这通常表明其他东西,可能是您自己的应用程序中的某些其他线程,已经有您尝试在文件系统级别锁定的目标文件.如果你看一下内部异常我相信它应该提到这一点.如果它不是直接在InnerException中另一种确认这一点的方法(或者发现它可能实际上是什么)是打开调试器中的第一次机会异常,并观察在"下面"抛出的异常保存然后转为此一般例外.


小智 5

尝试了这里给出的所有解决方案,但徒劳无功。最终找到了解决方案。

  1. 处理应用于图像的任何图形: g.dispose();
  2. 确保保存路径存在: System.IO.Directory.Exists(dir);