-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 内にあるのか、それともこの問題の原因となっている何かが私のコードに見られるのかどうかはわかりません。

どんな提案でも大歓迎です

4

1 に答える 1