close

讀取大的圖檔時發生記憶體不足的問題。(轉載)

最近常遇到配置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就行了。

arrow
arrow
    全站熱搜

    createps 發表在 痞客邦 留言(1) 人氣()