Утечка памяти Где это

Я получаю исключение из нехватки памяти при циклическом просмотре изображений. Это происходит после примерно 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 или кто-то может увидеть в моем коде что-то, что вызывает эту проблему.

Любые предложения будут с благодарностью

1 ответ

Решение

Когда img.Matte верно, вы заменяете изображение в img переменная с новым изображением. Предыдущее изображение никогда не удаляется.

Удалите предыдущее изображение, прежде чем заменить его:

        if (img.Matte)
        {
            img.Dispose();
            ms = RemoveAlphaChanell(currentFile.FullName);
            img = new Image(ms);
            alphaChannelRemoved = true;
        }
Другие вопросы по тегам