使用大图像时出现内存异常

时间:2015-04-02 15:49:20

标签: c# image out-of-memory

以下行在加载大图像时抛出OutOfMemoryException

System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);

我尝试使用8280x6208 8,76 MB图像文件和许多其他较小的图像,这很好用。

但是当我尝试使用10328x7760 6,44 MB的图像文件时,它会抛出OutOfMemoryException。

我也尝试在photoshop中打开文件并以更差的质量(1,32 MB)保存它,但是使用相同的尺寸,它会抛出OutOfMemoryException。

我尝试将另一个较小的图像扩展到10328x7760并抛出OutOfMemoryException。

所以我很确定这是一个实际的内存不足问题,我的问题是:

我可以以某种方式增加记忆吗?

我正在使用带有8GB RAM的Windows 8.1 64位,带有IIS Express的Visual Studio 2013。这是一个Web应用程序项目。

编辑:我不认为这是建议的格式问题,我尝试使用10000x10000黑色图像和5000x5000黑色图像。 10000抛出OOM,5000没有。

3 个答案:

答案 0 :(得分:3)

将其编译为“任何CPU”并取消Visual Studio解决方案构建配置中的“首选32位”。

并不是说你没有内存,而是默认情况下.NET应用程序以32位进程运行,而且它没有足够的内存。

答案 1 :(得分:3)

来自Image.FromFile文档,我们可以读到:

  

如果文件没有有效的图像格式,或者GDI +不支持文件的像素格式,则此方法会抛出OutOfMemoryException异常。

您可能想尝试使用替代方法Image.FromStream。你不应该得到例外

var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read)
var img = Image.FromStream(fs)
fs.Dispose()

答案 2 :(得分:0)

我能够使用以下代码将其加载到System.Windows.Controls.Image对象中。

            Stream imageStreamSource = new FileStream("largeImage.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);               
            JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            BitmapSource bitmapSource = decoder.Frames[0];
            System.Windows.Controls.Image myImage = new System.Windows.Controls.Image();
            myImage.Source = bitmapSource;

当你完成游戏后,别忘了Dispose