繁体   English   中英

使用ImageResizer和内存不足异常调整大图像的大小

[英]Resizing large images with ImageResizer and out of memory exceptions

当我使用ImageResizer.Net(在32位系统上)调整图像9000x9000 square时,我遇到内存不足异常:

ImageBuilder.Current.Build(imageFileName, outputFileName, settings, true);

我能够使用流成功调整大图像的大小:

using (var stream = new FileStream(imageFileName, FileMode.Open, FileAccess.Read))
using (var img = Image.FromStream(stream, true, false))
{
    ImageBuilder.Current.Build(img, outputFileName, settings);
    stream.Close();
}

但是,最后一个方法在x循环后仍会遇到内存不足异常。 ImageResizer中是否存在大量内存泄漏,或者代码中是否存在错误?

无论哪种方式,是否有解决方法?

如果您要处理8100万像素图像,则需要64位系统。 只需解压缩图像就需要350到800 个连续的兆字节RAM。

在32位系统上(即使安装了16GB的ram),任何.NET进程最初只能使用1200MB左右。 由于碎片(不是内存泄漏!),任何活动都会将1200MB分成小的50-100MB块。 由于您需要800MB块的内存(因为您正在处理大量图像),因此停止工作很快。

为了让.NET能够对抗内存碎片,你需要给它(a)时间和(b)足够的额外空间。

在64位系统上,该进程应该能够访问足够的RAM,以便.NET运行时不会在这些工作负载下挨饿。

我认为你的内存最大化了一些大图像调整大小(虽然不确定)。

尝试使用DiskCache插件: http ://imageresizing.net/plugins/diskcache http://imageresizing.net/download

它会将调整大小的图像直接写入磁盘,绕过任何RAM问题。 而且它也非常快。

我很抱歉回答“试试这个”评论作为答案,但由于SO声誉不足,我暂时无法撰写评论。

正如计算机语言学家在评论他们自己的答案时所提到的,libvips能够在使用(更多)更少内存的同时调整大图像的大小。 [我实际上最终使用了命令行版本,因为我没有遇到任何用于库本身的.NET包装器。]

在我的情况下,我试图调整大小的图像是21,920×14,610像素。 ImageResizer成功调整了图像的PNG版本(15+ MB),但为JPEG版本(22 + MB)抛出了OutOfMemoryException

我在具有8 GB RAM的计算机上运行Windows 7 64位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM