2010-10-03 218 views
15

爲什麼會出現內存不足錯誤?謝謝內存不足Image.FromFile

if (File.Exists(photoURI)) 
{ 
    FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read); 
    Image img = Image.FromStream(fs); 
    fs.Close(); 
} 
+0

也許圖像太大?你試圖加載什麼? – schnaader 2010-10-03 01:11:16

+0

一張圖片,其唯一的156KB – xscape 2010-10-03 01:12:15

+0

您是否打開任何其他圖片?什麼格式的圖像? – JoshD 2010-10-03 01:14:25

回答

28

Image.FromFile文檔,一個OutOfMemoryException可拋出如果:

該文件沒有有效的圖像格式。

- 或 -

GDI +不支持該文件的像素格式。

檢查您的圖像格式。

此外,如果您想在加載圖像後立即關閉流,您必須必須複製圖像。看看here。 GDI +必須在圖像的整個生命週期內保持數據流暢通。

+0

其.png文件格式 – xscape 2010-10-03 01:26:19

+1

然後,它是像素格式。 – 2010-10-03 01:30:42

+0

嘗試在另一個應用程序中打開圖像,並用不同的像素格式保存它。 – 2010-10-03 01:57:00

7

的第一個錯誤:

if (File.Exists()) 

文件系統是揮發性的,所以訪問您的文件可以用你的,如果條件和線下的線之間改變英寸不僅如此,File.Exists()可能會返回true,但如果文件缺少安全權限或者它已被鎖定,則FileStream仍可能會引發異常。

相反,正確的方法來處理這是一個try/catch塊。把你的開發時間放在異常處理程序上,因爲你必須編寫代碼。

第二個錯誤:

fs.Close(); 

此行必須是在finally塊,或者你要離開打開的文件句柄躺在附近的潛力。我通常建議using塊,以確保這種資源的妥善處理,但既然你已經需要try/catch語句,你可以用這樣的代碼來代替:

Image img = null; 
FileStream fs = null; 
try 
{ 
    fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);  
    img = Image.FromStream(fs);  
} 
finally 
{ 
    fs.Close(); 
} 
+2

如果您想要使用過去的圖像,則無法關閉流。看看[這裏](http://stackoverflow.com/questions/3661799/file-delete-failing-when-image-fromfile-was-called-prior-it-despite-making-copy/3661892#3661892)。 – 2010-10-03 01:28:10

+0

在這種情況下,我傾向於用自己的IDisposable實現將其包裝在一個類中,該實現的行爲更直觀。 – 2010-10-03 01:35:57

+0

fs?.Close()適用於c#6及更高版本。 – 2015-10-16 08:11:18

2

我有同樣的問題,圖像或位圖的內存不足例外,我試圖調整大小,在面板和圖片框,繪畫它很多。我有可用的記憶,所以在我的例子中,這個例外是一個紅鯡魚。

經過數小時的PC踢我發現它是一個第三方DLL沒有關閉流。有些「的WriteLine」調試,可能是有用的檢查您是否也確實有可用內存:

proc = Process.GetCurrentProcess(); 
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64); 
+0

,肯定給了我一個檢查文件的提示,打開導致這個問題的提示 - 在Process Explorer中使用Find Handle/DLL顯示它們有打開的句柄通過系統進程 - 我不得不手動關閉手柄(好吧,我絕對不知道是什麼讓他們 - 如果我知道我一定會關閉它們),問題就消失了 – 2014-10-30 15:39:01

3

不能使用Image.FromStream爲您的文件,而必須使用解碼的TiffBitmapDecoder文件。從MSDN示例代碼:

// Open a Stream and decode a TIFF image 
Stream imageStreamSource = new FileStream("tulipfarm.tif", FileMode.Open, FileAccess.Read, FileShare.Read); 
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
BitmapSource bitmapSource = decoder.Frames[0]; 

// Draw the Image 
Image myImage = new Image(); 
myImage.Source = bitmapSource; 
myImage.Stretch = Stretch.None; 
myImage.Margin = new Thickness(20); 
1

由Hans帕桑特見this reply

GDI +寫很長一段時間之前,.NET曾經來到身邊。 SDK的 包裝是用C++編寫的。爲了保持它的兼容性,它不能使用例外情況 。錯誤情況報告了錯誤代碼。 從來不會很好地擴展,GDI +只有20個錯誤代碼。這對於 這麼大的代碼塊來說並不多。

Status :: OutOfMemory錯誤代碼被重載,意味着不同的 的東西。有時它確實意味着內存不足,它不能分配足夠的空間來存儲位圖位。可悲的是,不知道 是怎麼發生的,圖像文件格式問題是由相同的錯誤 代碼報告的。我想,沒有專門的錯誤代碼可以更精確地描述它。

0

取消選中文件屬性中的Encrypt contents to secure data - 這解決了我的問題。

enter image description here