2014-06-05 134 views
-3

我在循環顯示圖像時出現內存不足異常。它發生在約500張圖片後。內存泄漏它在哪裏

如果我試圖通過並行循環運行相同的代碼,它只能通過約5個圖像。

它通常似乎拋出內存溢出異常

這裏是我的代碼之前放慢。我使用MagickNet

public static void PreProductionProcessing(DirectoryInfo dirInfo) 
{ 
    var tw = new StreamWriter(@"C:\bar.csv", true); 

    tw.WriteLine("Filename, Alpha Channel Removed, Dpi Changed, Resized"); 
    foreach (var currentFile in dirInfo.GetFiles("*.tif")) 
    { 
     var alphaChannelRemoved = false; 
     var resized = false; 
     var DpiChanged = false; 

     Image img = null; 

     MemoryStream ms = null; 

     try 
     { 
      img = new Image(currentFile.FullName); 

      if (img.Matte) 
      { 
       ms = RemoveAlphaChanell(currentFile.FullName); 
       img = new Image(ms); 
       alphaChannelRemoved = true; 
      } 

      if (img.Density.x_res < 300) 
      { 
       img.Density = new Image.Resolution(300, 300); 
       DpiChanged = true; 
      } 

      if (img.Size.Width != 1875) 
      { 
       var newSize = img.Size; 
       double resizeRatio = (double)newSize.Width/(double)1875; 

       newSize.Width = Convert.ToInt16(img.Size.Width/resizeRatio); 
       newSize.Height = Convert.ToInt16(img.Size.Height/resizeRatio); 

       img.Resize(newSize); 
       resized = true; 
      } 

      using (var filestream = new FileStream(Path.Combine(@"C:\OutFolder", currentFile.Name), FileMode.CreateNew)) 
      { 
       img.Write(filestream, "tif"); 
      } 

      tw.WriteLine("{0}, {1}, {2}, {3}", currentFile.Name, alphaChannelRemoved, DpiChanged, resized); 

      tw.Flush(); 
     } 
     catch (Exception e) 
     { 
      tw.WriteLine("{0}, {1}", currentFile.Name, e.Message); 
      tw.Flush(); 
     } 
     finally 
     { 
      if (img != null) 
      { 
       img.Dispose(); 
       img = null; 
      } 

      if (ms != null) 
       ms.Dispose(); 

      Magick.Term(); 
     } 
    } 
} 

static MemoryStream RemoveAlphaChanell(string source) 
{ 
    Bitmap old = new Bitmap(source); 
    Bitmap temp = new Bitmap(old.Width, old.Height, PixelFormat.Format24bppRgb); 
    Graphics g = Graphics.FromImage(temp); 
    g.Clear(System.Drawing.Color.White); 
    var rect = new Rectangle(Point.Empty, new Size(old.Width, old.Height)); 
    g.DrawImage(old, rect); 
    var stream = new MemoryStream(); 

    temp.Save(stream, ImageFormat.Tiff); 
    stream.Seek(0, SeekOrigin.Begin); 

    old.Dispose(); 
    temp.Dispose(); 
    g.Dispose(); 

    return stream; 
} 

我不知道,如果內存泄漏內MagickNet或者如果任何人都可以看到在我的代碼任何導致此問題。

任何建議,將不勝感激

+0

您是否嘗試過使用分析? –

+1

如果可能的話,你應該把'MemoryStream ms'包裝在'using'中。除此之外,你可能需要一個內存profilier,Visual Studio有一個。 –

+0

@ L.B在'try'塊的'finally'塊中初始化它。 – Servy

回答

3

img.Matte是真實的,你用一個新形象替換img可變圖像。之前的圖像從不處理。

處置以前的圖像則在更換之前:

 if (img.Matte) 
     { 
      img.Dispose(); 
      ms = RemoveAlphaChanell(currentFile.FullName); 
      img = new Image(ms); 
      alphaChannelRemoved = true; 
     } 
+0

感謝您的幫助,似乎已經完成了這個伎倆。不知道我在想什麼。我非常感謝幫助。 –