C# System.Drawing.dll中发生System.OutOfMemoryException,图片量大
我有一个文件夹的高度和数量的地理定位文件,我想做一个KML与placemark。 XML(KML)文档没有问题,但是图像很大,我想在单独的文件夹中创建一个拇指(1/10)和一个小图像(1/4)。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
图片大小为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文件