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

时间:2011-04-28 04:28:23

标签: 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);                            
    // ...
}

但我仍然得到错误:

  

GDI +发生了一般错误

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

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

有人可以告诉我这段代码中的错误是什么?

修改 System.Drawing.ImageSystem.Drawing.Bitmap的{​​{1}}类型。{/ p>

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

12 个答案:

答案 0 :(得分:40)

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

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

SaveFileDialog指定的路径+相对路径

自动

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

感谢每一个人的答案。

答案 1 :(得分:19)

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

Bitmap bm3 = new Bitmap(bm2);

然后保存。

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:1)

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

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

此外,您的代码可以简化为:

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

答案 7 :(得分: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();
}

答案 8 :(得分: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();
}

答案 9 :(得分:0)

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

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing

答案 10 :(得分:0)

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

答案 11 :(得分:0)

通过更改图像类型" .bmp"我遇到了同样的问题。到" .png"它的工作形成了我