27

我在 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。

由于 tempImg 在 using 内部并且它已被处理,我认为应该解决锁定问题。

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

编辑System.Drawing.Image作为System.Drawing.Bitmap.tempImg

编辑: 我已经确定只有在创建 SaveFileDialog 并且用户单击“保存”后才会收到此错误。

4

11 回答 11

41

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

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

SaveFileDialog 指定的路径 + 相对路径

自动地。

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

谢谢大家的回答。

于 2011-05-05T09:30:28.303 回答
20

我也遇到过这个问题-它发生是因为位图锁定并且您无法保存它(如果您愿意,我可以找到确切的解释)所以无论如何解决方法是:创建一个与您原始位图大小相同的新位图have-将原始位图复制到新创建的位图,然后处理原始位图并保存新位图。

Bitmap bm3 = new Bitmap(bm2);

然后保存。

于 2011-04-28T08:55:27.840 回答
5

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

于 2011-04-28T05:01:19.470 回答
5

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

  1. 处理应用于图像的任何图形:g.dispose();
  2. 确保保存路径存在:System.IO.Directory.Exists(dir);
于 2012-08-15T01:26:44.753 回答
1

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

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

您的代码也可以简化为:

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }
于 2011-04-28T05:28:43.343 回答
1

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

于 2016-08-19T07:15:04.130 回答
0

这是来自 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();
}
于 2011-04-28T06:37:53.577 回答
0

我正在尝试从资源中保存图像,当我直接使用方法 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();
}
于 2013-06-30T19:23:22.243 回答
0

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

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing
于 2015-05-19T09:15:26.703 回答
0

就我而言,我将位图文件保存在与源相同的位置,所以这就是问题所在。我将位图保存到新位置,现在一切正常。

于 2017-01-21T20:42:20.513 回答
0

我遇到了同样的问题,通过将图像类型“.bmp”更改为“.png”它的工作形式我

于 2017-06-27T03:33:58.113 回答