2013-02-22 79 views
1

我在C#中使用了簡單的Image.RotateFlip()方法,但我不斷收到一條錯誤,指出「內存不足」。我運行它通過一個分析器,發現它發生在System.Drawing.Image.FromFile();圖像旋轉內存錯誤

這裏是我的代碼:

protected void rotatePic(object sender, EventArgs e) 
    { 
     ImageButton img = sender as ImageButton; 
     string url = img.ImageUrl.Split('?')[0]; 

     System.Drawing.Image pic = System.Drawing.Image.FromFile(Server.MapPath(url)); 
     pic.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone); 
     pic.Save(Server.MapPath(url)); 
     pic.Dispose(); 
     img.ImageUrl = img.ImageUrl + "?" + DateTime.Now.ToString(); 
    } 
+0

圖像有多大? – Quibblesome 2013-02-22 23:31:26

+0

@Quibblesome他們總是不同,但最大的是4MB以下。 – 2013-02-22 23:34:01

+0

很可能OOM是真實的。那就是你正在運行OOM,特別是如果Ed S是正確的,而且你沒有正確處理圖像。找出(如果它在代碼中不明顯)的最好方法是附加.NET內存分析器並檢查堆。雖然我在System.Drawing中遇到過不正確的OOM,但它們通常位於具有定製性差的操作系統的移動設備上。因此,在認爲API可能不合適之前,先對其進行配置並三重檢查您的代碼。 – Quibblesome 2013-02-22 23:36:18

回答

3

你的問題缺乏大量的相關信息。第一;形象有多大。其次,這個代碼是如何被調用的。它是否經常被調用?您何時致電pic致電Dispose()System.Drawing.Image實現IDisposable,所以你的代碼應該(可能)是這樣的:

using(var pic = System.Drawing.Image.FromFile(Server.MapPath(url))) 
{ 
    pic.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone); 
    pic.Save(Server.MapPath(url)); 
} 
+0

請檢查編輯。 – 2013-02-22 23:35:36

+0

@StørmShadøws:還沒有回答這些問題:*「首先,圖像有多大,其次,這個代碼是如何被調用的。」*另外,使用'using'語句。如果'RotateFlip'或'Save'拋出,則不要調用'Dispose()'。 – 2013-02-22 23:36:23

+0

圖像大小因爲上傳到服務器而有所不同。圖像的最大尺寸是4MB。代碼在圖像點擊時被調用。 – 2013-02-22 23:37:36

0

如果你是做了好幾次,你不應該忘記的Dispose()圖像。

+0

我補充說,但是這個被調用的機率在每250張圖片中是1。所以我相信這不是問題。 – 2013-02-22 23:43:53