gpt4 book ai didi

c# - 调整许多位图大小时出现内存不足异常

转载 作者:行者123 更新时间:2023-12-03 16:48:04 25 4
gpt4 key购买 nike

我需要调整 5000 张图像的大小并将它们保存在一个单独的文件夹中。我有一个这样的代码来创建图片的调整大小副本(在互联网上找到):

Bitmap ResizeImage(System.Drawing.Image image, int width, int height)

{
var destRect = new System.Drawing.Rectangle(0, 0, width, height);
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);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}

return destImage;
}
我有这个代码,它首先创建所有必要的目录来保存图片,然后开始更改所有图像并将它们保存到新文件夹中。在执行程序的过程中,我的内存开始填满,直到达到~590mb(~1800张图像)的标记,然后抛出OutOfMemoryException错误。
void ResizeAllImages()
{
var files = Directory.GetFiles(ImagesDirectory, "*", SearchOption.AllDirectories);

if (!Directory.Exists(ResizedImagesDirectory)) Directory.CreateDirectory(ResizedImagesDirectory);

var dirs = Directory.GetDirectories(ImagesDirectory);

foreach(var d in dirs) Directory.CreateDirectory(System.IO.Path.Combine(ResizedImagesDirectory, System.IO.Path.GetFileName(d)));

foreach(var f in files)
{
using(var image = ResizeImage(System.Drawing.Image.FromFile(f), 224, 224))
{
var imgName = System.IO.Path.GetFileName(f);

var dirName = System.IO.Path.GetFileName(System.IO.Path.GetDirectoryName(f));

image.Save(System.IO.Path.Combine(ResizedImagesDirectory, dirName, imgName), ImageFormat.Png);
}
}
}
为了解决这个问题,我尝试在foreach中添加以下两行代码:
GC.Collect();
GC.WaitForPendingFinalizers();
分析器开始显示,在整个程序运行过程中,该过程需要大约 50 mb,但是,当达到之前的大约 1800 张图像的标记时,我再次收到 OutOfMemoryException。我怎么解决这个问题。先感谢您

最佳答案

根据 MSDN,OutOfMemoryException可以在一些非直观的情况下抛出。例如可以在Bitmap.Clone中抛出方法:

OutOfMemoryException:rect is outside of the source bitmap bounds.


我们可以看到您没有使用 Clone 方法,而是使用了一个 Rect 和一个位图,并且由于您的程序的内存占用没有超过 50MB,我们可以推断出问题是相似的。
要真正解决此问题,您应该首先隔离有问题的图像,准确验证发生了什么,然后进行相应的操作。

关于c# - 调整许多位图大小时出现内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63833340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com