爲什麼會出現內存不足錯誤?謝謝內存不足Image.FromFile
if (File.Exists(photoURI))
{
FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
}
爲什麼會出現內存不足錯誤?謝謝內存不足Image.FromFile
if (File.Exists(photoURI))
{
FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
}
在Image.FromFile
文檔,一個OutOfMemoryException
可拋出如果:
該文件沒有有效的圖像格式。
- 或 -
GDI +不支持該文件的像素格式。
檢查您的圖像格式。
此外,如果您想在加載圖像後立即關閉流,您必須必須複製圖像。看看here。 GDI +必須在圖像的整個生命週期內保持數據流暢通。
其.png文件格式 – xscape 2010-10-03 01:26:19
然後,它是像素格式。 – 2010-10-03 01:30:42
嘗試在另一個應用程序中打開圖像,並用不同的像素格式保存它。 – 2010-10-03 01:57:00
的第一個錯誤:
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();
}
如果您想要使用過去的圖像,則無法關閉流。看看[這裏](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
在這種情況下,我傾向於用自己的IDisposable實現將其包裝在一個類中,該實現的行爲更直觀。 – 2010-10-03 01:35:57
fs?.Close()適用於c#6及更高版本。 – 2015-10-16 08:11:18
我有同樣的問題,圖像或位圖的內存不足例外,我試圖調整大小,在面板和圖片框,繪畫它很多。我有可用的記憶,所以在我的例子中,這個例外是一個紅鯡魚。
經過數小時的PC踢我發現它是一個第三方DLL沒有關閉流。有些「的WriteLine」調試,可能是有用的檢查您是否也確實有可用內存:
proc = Process.GetCurrentProcess();
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64);
,肯定給了我一個檢查文件的提示,打開導致這個問題的提示 - 在Process Explorer中使用Find Handle/DLL顯示它們有打開的句柄通過系統進程 - 我不得不手動關閉手柄(好吧,我絕對不知道是什麼讓他們 - 如果我知道我一定會關閉它們),問題就消失了 – 2014-10-30 15:39:01
不能使用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);
由Hans帕桑特見this reply:
GDI +寫很長一段時間之前,.NET曾經來到身邊。 SDK的 包裝是用C++編寫的。爲了保持它的兼容性,它不能使用例外情況 。錯誤情況報告了錯誤代碼。 從來不會很好地擴展,GDI +只有20個錯誤代碼。這對於 這麼大的代碼塊來說並不多。
Status :: OutOfMemory錯誤代碼被重載,意味着不同的 的東西。有時它確實意味着內存不足,它不能分配足夠的空間來存儲位圖位。可悲的是,不知道 是怎麼發生的,圖像文件格式問題是由相同的錯誤 代碼報告的。我想,沒有專門的錯誤代碼可以更精確地描述它。
取消選中文件屬性中的Encrypt contents to secure data
- 這解決了我的問題。
也許圖像太大?你試圖加載什麼? – schnaader 2010-10-03 01:11:16
一張圖片,其唯一的156KB – xscape 2010-10-03 01:12:15
您是否打開任何其他圖片?什麼格式的圖像? – JoshD 2010-10-03 01:14:25