2016-12-30 83 views
1

加載多個放大圖,當我嘗試從磁盤裝入圖像的列表(各30〜50 MB大小)如下的System.OutOfMemoryException從磁盤

var images = new List<Image>(); 
    foreach (var imgPath in paths) 
    { 
     var img = Image.FromFile(imgPath); 
     images.Add(img); 
    } 

的問題是,後的第一或第二像我得到一個

的System.OutOfMemoryException

...我的猜測是,圖像太大。我知道一個好習慣是逐個處理圖像,但我不能,因爲我需要將所有這些圖像合併爲一個圖像(如拼貼),並且我無法使用縮略圖,因爲我需要尊重原始尺寸。

我試圖將maxRequestLength更改爲"10000000",但它沒用。

由於我無法到達圖像處理步驟,我不認爲我沒有處置對象的問題,至少現在還沒有。

有沒有辦法增加可用的內存,或類似的東西?

P.S.我使用JPG格式的圖像。

+1

你確定它是_「第一個或第二個圖像」_? _「每個30到50 MB」 - - 很小。現在查看Google Chome時,我正在使用** 129 MB **進行比較。你有沒有嘗試在VS中運行內存泄漏工具? – MickyD

+2

有什麼'maxRequestLength'處理_「從磁盤加載圖像」_? – MickyD

+0

有太多變數可以輕鬆幫助您,例如硬件配置,操作系統,應用程序類型,應用程序配置。顯然你需要增加你的應用程序的可用內存,但很難說如何實現這一點。 –

回答

0

我不推薦使用:

Image.FromFile(path); 

這是緩慢的,將臃腫的過程 相反:

var fs = new FileStream(path, FileMode.Open, FileAccess.Read); 
var photo = Image.FromStream(fs, true, false); 

不要忘記處置;-)

基本上代替將所有數據一次性帶入記憶並殺死你的應用和你所愛的人。您像操作數據流一樣操作圖像。

編輯

在這兩種情況下,我不建議一次修改所有圖像。 你可能會遇到OutOfMemoryException。

如果可能的話,在當時處理兩張圖像,一旦完成,處理它們並移動到下一組,直到最終圖像完成。