2013-02-14 69 views
5

我正在开发Outlook 2010加载项,并正在从序列化XML文件加载图像。图像加载正常,并且能够将它分配给Winform上的pictureBox对象没问题。对象保存在尝试使用Image.Save时出现“GDI +中发生的通用错误”

[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

有这么这个错误有很多可能的原因..它非常令人沮丧。有些事情要尝试:1)写入不同的文件夹。 2)检查文件的尺寸。如果它太大(在4000x4000的范围内),它也会抛出这个错误。 3)确保文件没有被其他任何东西使用(包括你的代码)。 – 2013-02-14 02:04:19

+0

@Simon怀特黑德感谢您的建议。我试图写入父目录,也到C:\ temp但没有奏效。该文件的尺寸是64x64像素(小)。 #3是我唯一没有尝试过的。我想我可以复制图像到一个新的对象,并尝试写一个。会马上报告。 – Magnum 2013-02-14 02:06:46

+0

@Simon Whitehead工作!事实上,我的代码使用item迭代,所以看起来GDI +在完成后无法处理它。 – Magnum 2013-02-14 02:10:54

回答

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); 
} 
+3

这仍然不能解决它,你必须处理* tempImage *释放文件上的锁。使用* using *语句。 – 2013-02-14 02:43:14

+0

@HansPassant谢谢,我修改了我的答案以反映您的评论。 – Magnum 2013-02-14 22:04:20

+0

非常感谢!这是我遇到问题的原因。在using块中创建一个新的Bitmap对象为我解决了这个问题。 – 2015-02-11 16:13:01

7

我也面临同样的错误代码行:

wmImg.Save(BrandImgPath,ImageFormat.Png); 

BrandImgPath = "D:/XYZ/fileName; 

实测值的原因:

XYZ夹并未d存在:驱动器。所以我的代码稍后创建了这个文件夹。人们应该确保这条道路是否存在。

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

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

2


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

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

1

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

0

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

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

正如gaffleck说,这将是很好,如果GDI +投掷了更多的信息除外。

0

我有相同的泛型异常,但后来我给平行plesk文件管理器上的IIS写入权限。如果在Windows服务器上,确保给写权限IIS用户这是IIS_IUSR在我的服务器

也确保您试图保存的文件夹是正确的,因为在上述意见中提到

相关问题