2013-10-22 195 views
0

我得到了一些從數據庫中檢索圖像的代碼,然後重新調整大小以便在特定頁面上顯示。 但是,在某些圖像上出現「內存不足」錯誤。內存不足 - Graphics.DrawImage

在我目前的情況下,我只在一個圖像上得到它,其餘的圖像工作正常。

請參閱下面的代碼。我錯過了什麼嗎?我不正確地釋放對象嗎?或者我的一些使用聲明應該改進? canvas.DrawImage行給出錯誤。 任何幫助定位我的代碼中的錯誤將不勝感激。

平臺版本是:任何CPU 我的操作系統:Win 7的64位

private byte[] SaveResizedImage(byte[] origImageBytes, int targetSize) 
{ 
    using (MemoryStream ms = new MemoryStream(origImageBytes)) 
    using (Image origImage = Image.FromStream(ms)) 
    { 
     Size newSize = CalculateDimensions(origImage.Size, targetSize); 

     using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb)) 
     using (Graphics canvas = Graphics.FromImage(newImage)) 
     { 
      canvas.SmoothingMode = SmoothingMode.AntiAlias; 
      canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      canvas.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      canvas.DrawImage(origImage, new Rectangle(new Point(0, 0), newSize)); <--- This line give the exception error 

      ImageCodecInfo codecInfo = GetEncoderInfo(ImageFormat.Jpeg); 

      EncoderParameters encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 75L); 

      using (MemoryStream newms = new MemoryStream()) 
      { 
       newImage.Save(newms, codecInfo, encoderParams); 
       return newms.ToArray(); 
      } 
     } 
    } 
} 

public static ImageCodecInfo GetEncoderInfo(ImageFormat format) 
{ 
    return ImageCodecInfo.GetImageEncoders().ToList().Find(delegate(ImageCodecInfo codec) 
     { 
      return codec.FormatID == format.Guid; 
     }); 
} 

private static Size CalculateDimensions(Size oldSize, int targetSize) 
{ 
    Size newSize = new Size(); 
    if (oldSize.Height > oldSize.Width) 
    { 
     newSize.Width = (int)(oldSize.Width * ((float)targetSize/(float)oldSize.Height)); 
     newSize.Height = targetSize; 
    } 
    else 
    { 
     newSize.Width = targetSize; 
     newSize.Height = (int)(oldSize.Height * ((float)targetSize/(float)oldSize.Width)); 
    } 
    return newSize; 
} 

感謝

+0

GDI已知會在轉換過程中拋出錯誤的OOM。您的問題可能是損壞的BMP文件或不支持的格式。或... –

+0

圖像有多大,即targetSize和origImage.Size的值是多少?你在32位或64位上運行?閱讀:http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx –

+0

@KrisVandermotten那篇文章是不管怎樣與這個問題有關。這是gdi +問題。 –

回答

0

我也有類似的問題,同時在循環處理多張圖片。我以這種方式解決了這個問題: - 我確保不再需要圖像,位圖對象等。 - 我在引發懷疑的方法的開始處添加了GC.Collect()。

看起來,一般來說,當你處理圖形時,你最好明確地調用垃圾回收器。

現在,您的計算機可能實際上缺少內存,但這可能有助於進一步推動治療。