在使用SaveFileDialog后,在Bitmap.Save()的GDI+中发生通用错误

本文关键字:GDI+ 错误 SaveFileDialog Save Bitmap | 更新日期: 2023-09-27 17:53:16

我使用了下面的代码块,using块中还有一些代码:

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

但是我仍然得到错误:

GDI+出现一般性错误

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

由于时间是在使用和这是处置,我认为锁定问题应该得到解决。

谁能告诉我这段代码中的错误是什么?

编辑:

System.Drawing.ImageSystem.Drawing.Bitmap作为tempImg的类型

编辑:

我已经确定,只有在创建SaveFileDialog并用户单击"保存"后,我才能得到此错误。

在使用SaveFileDialog后,在Bitmap.Save()的GDI+中发生通用错误

最后我可以找到我的代码是什么错了,我想在这里提到它,因为我认为它可能对某人有用....

我已经给出了一个相对路径。保存,并在用户单击SaveFileDialog中的"保存"之后,为临时设置的实际路径。保存成:

SaveFileDialog指定的路径+相对路径

自动

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

谢谢大家的回答。

我也曾经有过这个问题-它发生了,因为位图锁,你不能保存它(如果你想我可以找到确切的解释),所以无论如何一个修复周围是这样的:创建一个与原始位图大小相同的新位图-将原始位图复制到新创建的位图中,然后处理原始位图并保存新位图。

Bitmap bm3 = new Bitmap(bm2);

然后保存

这通常是一个指示符,表明其他东西(可能是您自己的应用程序中的其他线程)已经在文件系统级别锁定了您试图保存的目标文件。如果你看内部异常,我相信它应该提到这一点。如果它不是直接在InnerException中,另一种确认这一点(或发现它可能真正是什么)的方法是在调试器中打开第一次机会异常,并观察什么异常被抛出"下面"保存,然后被转化为这个泛型异常。

尝试了这里给出的所有解决方案,但都无效。终于找到解决办法了。

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

这是ASP吗?网络应用程序?

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

你的代码也可以简化为:

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

在我的例子中,它是一个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",它的工作形式从我