6

我正在开发 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 等,以查看是否是转换问题……但不是。有人会建议尝试吗?

4

6 回答 6

25

感谢 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);
}
于 2013-02-14T02:13:39.313 回答
7

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

wmImg.Save(BrandImgPath,ImageFormat.Png);

BrandImgPath = "D:/XYZ/fileName;

找到原因:

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

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

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

于 2013-09-17T04:14:37.790 回答
2


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

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

于 2014-02-16T06:00:52.203 回答
1

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

于 2014-03-14T22:30:05.520 回答
0

就我而言,这是我保存图像的目录的路径中的拼写错误:

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

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

于 2014-08-26T15:59:48.503 回答
0

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

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

于 2014-09-24T10:10:36.987 回答