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

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

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

但我仍然得到错误:

GDI +发生了一般错误

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

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

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

编辑: System.Drawing.ImageSystem.Drawing.Bitmap作为tempImg的类型。

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

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

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

SaveFileDialog指定的路径+相对路径

自动。

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

感谢每一个人的答案。

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

 Bitmap bm3 = new Bitmap(bm2); 

然后保存。

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

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

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

这是一个ASP.NET应用程序吗?

在asp.net中的GDI +发生了一般错误,主要是因为缺少目标文件夹/访问权限。

您的代码也可以简化为:

  using (Image image= dataObject.GetImage()) { if (image != null) { image.Save("test.bmp"); } } 

在Bitmap的GDI +上发生一般错误。当文件夹受到保护或文件名无效时,通常会收到通常的错误。

一个常见的错误是忘记创建一个名称,只是单独编写文件夹名称。

在我的例子中,它是一个ASP.NET应用程序,我在其中替换了一个DLL,我不得不在部署后简单地重新启动应用程序池。 然后它工作正常。

这是Microsoft论坛的代码示例。

 // new image with transparent Alpha layer using (var bitmap = new Bitmap(330, 18, PixelFormat.Format32bppArgb)) { using (var graphics = Graphics.FromImage(bitmap)) { // add some anti-aliasing graphics.SmoothingMode = SmoothingMode.AntiAlias; using (var font = new Font("Arial", 14.0f, GraphicsUnit.Pixel)) { using (var brush = new SolidBrush(Color.White)) { // draw it graphics.DrawString(user.Email, font, brush, 0, 0); } } } // setup the response Response.Clear(); Response.ContentType = "image/png"; Response.BufferOutput = true; // write it to the output stream bitmap.Save(Response.OutputStream, ImageFormat.Png); Response.Flush(); } 

我试图从资源中保存图像,当我直接使用方法Bitmap.Save(filepath)时,它给了我太GDI错误。 我想我们可以通过克隆任何其他位图图像使用相同的下面的代码。

 Private void SaveResourceImage() { object resBmpObject = Resource.Image1.Clone();//Bitmap Image from resource file //object resBmpObject = anyBmpImage.clone(); //for image other than resource image Bitmap resBmpImage = (Bitmap)resBmpObject; resBmpImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png); resBmpImage.dispose(); } 

保存图像后处理你的bitMap对象:

  bitMap.Dispose() oimg.Dispose() bitMap = Nothing oimg = Nothing 

在我的情况下,我将位图文件保存在与源相同的位置,这就是问题所在。 我将位图保存到新位置,现在一切都很好。

我面临同样的问题,将图像类型“.bmp”更改为“.png”,这是我的工作