2010-08-24 74 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