C# System.Drawing.dll中发生System.OutOfMemoryException,图片量大

C# System.Drawing.dll中发生System.OutOfMemoryException,图片量大,c#,.net,C#,.net,我有一个文件夹的高度和数量的地理定位文件,我想做一个KML与placemark。 XML(KML)文档没有问题,但是图像很大,我想在单独的文件夹中创建一个拇指(1/10)和一个小图像(1/4)。 图片大小为4000x3000,大约5mb,数量很少,没有问题,但是当文件夹包含35个图片(调试中)时,我有问题。 我尝试过使用,GC使用一次性对象。收集仅用于图像细化,而不用于任何操作 我有一个文件夹,详细说明与1400图像或更多…有可能使这个应用程序与它一起工作吗 public static clas

我有一个文件夹的高度和数量的地理定位文件,我想做一个KML与placemark。 XML(KML)文档没有问题,但是图像很大,我想在单独的文件夹中创建一个拇指(1/10)和一个小图像(1/4)。
图片大小为4000x3000,大约5mb,数量很少,没有问题,但是当文件夹包含35个图片(调试中)时,我有问题。 我尝试过使用,
GC使用一次性对象。收集
仅用于图像细化,而不用于任何操作

我有一个文件夹,详细说明与1400图像或更多…有可能使这个应用程序与它一起工作吗

public static class MyClass_img
{
    public static void ResizeImage(Image image, int width, int height, string pathImage)
    {
        using (var destImage = new Bitmap(width, height))
        {
            destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            using (var graphics = Graphics.FromImage(destImage))
            {
                graphics.CompositingMode = CompositingMode.SourceCopy;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = SmoothingMode.HighQuality;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

                using (var wrapMode = new ImageAttributes())
                {
                    wrapMode.SetWrapMode(WrapMode.TileFlipXY);

                    var destRect = new Rectangle(0, 0, width, height);
                    graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
                }
            }

            destImage.Save(pathImage);
        }
        GC.Collect();
    }

    public static string imageReduce(Image img, string path, int percentValue, string extension, string folder)
    {
        var dirName = new DirectoryInfo(path).Parent.Name;
        string pathImg = folder + dirName + "_" + Path.GetFileNameWithoutExtension(path) + extension;
        AprItalia_img.ResizeImage(img, img.Width / percentValue, img.Height / percentValue, pathImg);
        return pathImg;
    }

}

您不必调用GC.Collect()

根据,

在释放对图像的最后引用>之前,始终调用Dispose。否则,在垃圾收集器调用Image>对象的Finalize方法之前,它正在使用的资源将不会>被释放

因此,在您的情况下,它似乎要完成。您是否也通过调用它的dispose来释放Image对象

您不必调用GC.Collect()

根据,

在释放对图像的最后引用>之前,始终调用Dispose。否则,在垃圾收集器调用Image>对象的Finalize方法之前,它正在使用的资源将不会>被释放


因此,在您的情况下,它似乎要完成。您是否也通过调用它的dispose来释放Image对象?

您可能没有处理传递到
imageReduce(Image img,…)
。不要执行
GC.Collect()
除非确实需要,因为频繁的清理会增加处理压力。另外,您的系统有什么RAM?我有16gb,但我已经读过了。。。是否可能有例外beacose使用全部1.2gb,ok是否可能更新到4gb,但为什么它都在内存中?我认为只需要XML文件,图像保存在文件夹中,对象被处理我已将build设置为64位…使用所有内存,目前有500个文件…使用系统的所有ram,但我不明白为什么要使用所有ram…我处理图像对象,另一个是xml文件您可能没有处理传递到
imageReduce(image img,…)
。不要执行
GC.Collect()
除非确实需要,因为频繁的清理会增加处理压力。另外,您的系统有什么RAM?我有16gb,但我已经读过了。。。是否可能有例外beacose使用全部1.2gb,ok是否可能更新到4gb,但为什么它都在内存中?我认为只需要XML文件,图像保存在文件夹中,对象是dispose,我已将build设置为64位…使用所有内存,目前有详细说明的500个文件…使用系统的所有ram,但我不明白为什么要使用所有ram…我处理图像对象,另一个是XML文件