内存溢出异常 - 加载极大图片

6

我正在尝试加载一张非常大的图片(14473x25684),但是我遇到了内存限制问题。

这里有一个简单的程序来演示这个问题:

static void Main(string[] args)
{
    string largeimage = @"C:\Temp\test_image.jpg"; // 14473x25684

    Image i = Bitmap.FromFile(largeimage); // OutofMemoryException was unhandled
}

现在我明白问题与我拥有多少物理内存无关,而是一个寻址限制。有什么办法可以避免这个限制吗?

这张图片确实有效,并且在Photoshop(VM大小:916MB)和ACDSee中可以正常打开。 也不必通过谷歌查询尺寸,因为列出的尺寸并非精确值。 :)

感谢您的时间。


我以前遇到过这个问题。据我所知,这是框架出了问题。 - Chuck Conway
哇,这是一张很大的图片。不幸的是,框架中的Bitmap类无法满足您的需求。您可能会发现采用分块方法更好,其中您自己编排位图头并将像素采样到更易管理的图像尺寸中。这是一个挑战,因为它涉及到一些轮子重建。如果Photoshop和ACDSee将整个未压缩的图像加载到内存中,我会感到惊讶。 - kbrimington
2个回答

4

Bitmap类需要约1.5GB的内存来保存该实例。 .NET内存分配器通常在1GB处出现问题。


0

操作系统无法分配连续的内存空间。你所能做的就是使用MemoryFailPoint并捕获InsufficientMemoryException异常。 但这只能避免应用程序崩溃。
对于我来说,要打开这样一个大文件,你应该使用二进制读取器并通过System.Drawing绘制文件。

这里有一个好问题和答案何时捕获OutOfMemoryException以及如何处理它?


操作系统可以做到这点(如果它是64位的),但.NET框架无法做到(即使它是64位的)。 - Windows programmer

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