2013-02-14 65 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在我的服務器

也確保您試圖保存的文件夾是正確的,因爲在上述意見中提到

相關問題