摘要:讀取大的圖檔時發生記憶體不足的問題。
最近常遇到配置Bitmap時發生記憶體不足的怪問題。但程式才使用不到900MB
配置的記憶體也不過才40MB,怎麼算都不會不夠呀。索性測試了一下,發現有一下幾種問題存在。
連續載入1個約160MB的灰階圖檔,在Debug模式下,只要載入2~3個,就會出現"記憶體不足"
Bitmap bmp1 = (Bitmap)Image.FromFile(@"c:\a1.bmp");
Bitmap bmp2 = (Bitmap)Image.FromFile(@"c:\a2.bmp");
Bitmap bmp3 = (Bitmap)Image.FromFile(@"c:\a3.bmp");
Bitmap bmp4 = (Bitmap)Image.FromFile(@"c:\a4.bmp");
但直接執行程式至少4個不會有問題。
記憶中,以前看網頁到處亂逛時,看到有一種寫法,是用FileStream的方式,試了載入5個大圖檔,不管在什麼模式都不會有問題。
如下:
FileStream fs = File.OpenRead(@"c:\a1.bmp")
Bitmap bmp1 = (Bitmap)Image.FromStream(fs);
fs.Close();
所以,以後載入最好都是利用FileStream的方式。
若是載入影像後,直接指定給PictureBox.Image,最好也利用這種方式,不然Bitmap.Dispose()時會發生"該物件使用中的例外"
錯誤的寫法,
PictureBox.Image = Image.FromFile(@"c:\a.bmp");
正確的寫法
FileStream fs = File.OpenRead(@"c:\a1.bmp")
PictureBox.Image = Image.FromStream(fs);
fs.Close();
註:若只是取得影像的Width及Height,則不要用FileStream的方式,那會完全載入影像,反而佔記憶體。
直接用Bitmap就行了。
============ 以下是簽名檔 ============
一個小小螺絲釘。
第一次建立Blog,希望以後能慢慢充實它。
Howard