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

时间:2013-09-14 16:16:01

标签: c# imageresizer

当我使用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中是否存在大量内存泄漏,或者我的代码中是否有错误?

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

3 个答案:

答案 0 :(得分:3)

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

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

要允许.NET打击内存碎片,你需要给它(a)时间和(b)足够的额外空间。

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

答案 1 :(得分:0)

我认为你的内存最大化了一些大图像(但不确定)。

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

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

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

答案 2 :(得分:0)

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

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

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