尝试使用Image.Save时,“GDI +中发生了一般错误”

时间:2013-02-14 01:56:46

标签: c# .net gdi+

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

[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等等,看看它是否是转换问题......但事实并非如此。有人会建议尝试一下吗?

6 个答案:

答案 0 :(得分:22)

感谢Simon Whitehead在评论中回答这个问题。他说,“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);
}

答案 1 :(得分:7)

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

wmImg.Save(BrandImgPath,ImageFormat.Png);

BrandImgPath = "D:/XYZ/fileName;

找到原因:

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

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

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

答案 2 :(得分:2)


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

希望Microsoft提供详细的异常错误而不是“Generic GDI + Errror”!!!

答案 3 :(得分:1)

如果我自己有这个问题,需要检查文件夹是否存在,GDI没有告诉我出了什么问题,本来不错。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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

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

相关问题