-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或者如果任何人都可以看到在我的代碼任何導致此問題。
任何建議,將不勝感激
您是否嘗試過使用分析? –
如果可能的話,你應該把'MemoryStream ms'包裝在'using'中。除此之外,你可能需要一個內存profilier,Visual Studio有一個。 –
@ L.B在'try'塊的'finally'塊中初始化它。 – Servy