使用大位图会导致内存溢出异常

8

我需要即时编辑(增加高度)图像。文件的尺寸通常为5000 * 4000。当我创建一个具有大尺寸的bmp并在bmp实例上调用Graphics.DrawImage方法时,我看到内存飙升到峰值。

如何摆脱内存不足异常?有没有一种方法可以在C#中处理大型位图?


1
这是一个内存问题,请查看此链接:http://stackoverflow.com/questions/5801652/bitmap-while-assigning-height-width-crashes/5802113#5802113 - V4Vendetta
1
我猜你在试图为.dll占用超过1GB的内存时遇到了其他人也经历过的同样问题。可能的解决方法是使用流来按块处理文件。 - Shekhar_Pro
2
一个80兆字节的位图很大但不算巨大。然而,当你应该调用Dispose()时却没有调用,你会耗尽内存。垃圾回收器运行的频率不足以隐藏这个问题。 - Hans Passant
2个回答

5

0

这取决于您的应用程序特定要求,从您的帖子中并不是很清楚,但通常来说,处理大型媒体文件(图像、声音、视频),我认为真正好的解决方案是

内存映射文件

将您的图像保存在磁盘上的内存映射文件中,并通过在磁盘上进行调整大小来释放尽可能多的RAM,以便从您可能不需要快速访问的大量数据中获得更快的访问速度(至少在那个时刻)

希望这可以帮助到您。 敬礼。


在.NET中做这件事情并不容易。 - Ian Ringrose
这比以前容易多了,相信我,因为现在你已经包装了.NET类。(仅适用于.NET Framework 4.0) - Tigran
1
OOM 永远不会 是由于内存耗尽而引起的。位图已经使用了 MMF,创建更多只会让您更快地耗尽虚拟内存。 - Hans Passant
@Hans:位图已经使用了MMF,你确定吗? - Tigran
1
我也很好奇,所以我反编译了 System.Drawing.Bitmap(string),但是没有看到任何MMF代码...以下的GDI方法是否可以实现呢?int num = SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(filename, out zero); - Davi Fiamenghi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接