2010-08-24 78 views
6

我试图加载一个非常大的图像(14473x25684),但我遇到了内存限制。OutofMemoryException - 加载非常大的图像

这里有一个简单的程序来说明这个问题:

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

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

现在我明白了,这个问题是不相关的我多少物理内存有,而是寻址的限制。有什么我可以做的,以解决这个限制?

图像确实有效,它在Photoshop(VM Size:916MB)和ACDSee中可以正常打开。 也不要打扰谷歌的维度列出的尺寸不准确。 :)

谢谢你的时间。

+0

我已经遇到过这个。从我可以告诉它的框架踢。 – 2010-08-24 04:49:54

+0

哇。这是一个大局。不幸的是,框架Bitmap类不会满足您的需求。您可能会发现采取分块的方法,您可以自己编组位图标题并将像素采样为更易于管理的图像尺寸,这是您的最佳选择。这是一个挑战,因为它涉及到一个小轮子重建。如果Photoshop和ACDSee将整个未压缩的图像加载到内存中,我会感到惊讶。 – kbrimington 2010-08-24 05:10:58

回答

4

Bitmap类将需要大约1.5 GB内存来保存该实例。 .NET内存分配器通常扼杀1GB标记。

0

操作系统无法分配连续数量的内存。你所能做的就是使用MemoryFailPoint并捕获InsufficientMemoryException。 但这只能让你从应用程序崩溃中解救出来。
至于我,打开这样一个大文件,你应该使用二进制读取器,并通过System.Drawing绘制一个文件。

这里是个好问题和答案When is it OK to catch an OutOfMemoryException and how to handle it?

+0

操作系统可以做到这一点(如果它是一个64位操作系统),但.NET框架不能(即使它是64位)。 – 2010-08-24 05:05:08