【问题标题】:"A generic error occurred in GDI+" when attempting to use Image.Save尝试使用 Image.Save 时出现“GDI+ 中发生一般错误”
【发布时间】:2015-09-30 21:45:19
【问题描述】:

我正在开发 Outlook 2010 加载项,并且正在从序列化的 XML 文件加载图像。图像加载良好,并且能够将其分配给 Winform 上的图片框对象没有问题。对象保存在

[XmlIgnore]
public Bitmap Image
{
   get { return this.templateImage; }
   set { this.templateImage = value; }
 }

当我尝试将物理文件保存到硬盘上时,我正在这样做:

string filePath = Path.Combine(dirPath, item.Id + ".jpg");
try
{
    item.Image.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception e)
{
    Debug.WriteLine("DEBUG::LoadImages()::Error attempting to create image::" + e.Message);
}

并且在 GDI+ 中出现一般性错误。我检查了文件夹的写权限,它确实有写权限。我不确定这里有什么问题。我还将 ImageFormat 更改为 bmp 和 png 等,以查看是否是转换问题……但不是。有人会建议尝试一下吗?

【问题讨论】:

  • 这个错误有很多可能的原因..它非常令人沮丧。一些事情要尝试: 1)写入不同的文件夹。 2) 检查文件的尺寸。如果它太大(在 4000x4000 范围内)也会抛出这个错误。 3) 确保文件没有被其他任何东西(包括你的代码)使用。
  • @Simon Whitehead 感谢您的建议。我尝试写入父目录,也写入 C:\temp 但这没有用。该文件的尺寸为 64x64 像素(小)。 #3 是唯一一个我还没有尝试过的。我想我可以将图像复制到一个新对象并尝试编写那个对象。将立即报告。
  • @Simon Whitehead 成功了!事实上,我的代码正在使用 item 进行迭代,所以 GDI+ 似乎无法在完成后处理它。

标签: c# .net gdi+


【解决方案1】:

感谢 Simon Whitehead 在 cmets 中回答这个问题。他说,“3)确保文件没有被其他任何东西(包括你的代码)使用。”

所以问题是我自己的代码正在使用 item.Image 对象,并阻止 GDI+ 对其调用 dispose() 方法。解决方案是将对象复制到一个新对象中,然后使用该对象“写入”。结果代码如下:

try
{
   using (Bitmap tempImage = new Bitmap(item.Image)) 
   {
      tempImage.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
   }    
}
catch (Exception e)
{
    Debug.WriteLine("DEBUG::LoadImages()::Error attempting to create image::" + e.Message);
}

【讨论】:

  • 那仍然无法解决,您必须释放 tempImage 以释放对文件的锁定。使用 using 语句。
  • @HansPassant 谢谢,我修改了答案以反映您的评论。
  • 非常感谢!这就是我遇到问题的原因。在 using 块中创建一个新的 Bitmap 对象为我解决了这个问题。
【解决方案2】:

我也遇到了同样的代码行错误:

wmImg.Save(BrandImgPath,ImageFormat.Png);

BrandImgPath = "D:/XYZ/fileName;

找到原因:

D: 盘中不存在 XYZ 文件夹。所以我的代码稍后会创建这个文件夹。应该确保该路径是否存在。

if (Directory.Exists(@"D:/XYZ")) return;

希望它能帮助某人解决他的代码错误。

【讨论】:

    【解决方案3】:


    1. 确保您的目标文件夹具有读/写权限(检查两次!)。
    2. 使用 Server.MapPath 更好
    3. 确保您的目标驱动器或文件夹上有可用空间。 4. 大多数时候我们不能在共享服务器上使用 Memory Streamers,所以我们应该确保提供者允许我们使用它。

    希望微软给出详细的异常错误而不是“Generic GDI+ Errror”!!!

    【讨论】:

      【解决方案4】:

      我自己有这个问题,需要检查文件夹是否存在,GDI 没有告诉我出了什么问题,会很好。

      【讨论】:

        【解决方案5】:

        在我的情况下,这是我保存图像的目录的路径中的拼写错误:

        if (Directory.Exists(directory_path))
        {
         image.SaveAs(directory_path + filename);
        }
        

        正如 gaffleck 所说,如果 GDI+ 抛出更多信息异常会很好。

        【讨论】:

          【解决方案6】:

          我有同样的一般异常,但后来我在并行 plesk 文件管理器上向 IIS 授予了写权限。如果您在 Windows 服务器上,请确保向 IIS 用户授予写入权限,该用户在我的服务器中为 IIS_IUSR

          还要确保您尝试保存的文件夹是正确的,如上面 cmets 中所述

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多