Winform應用程序Image OOM異常時的處理方法

在做Winform應用程序處理Image時碰到了這樣一個問題。窗體設計如下:

當點擊上面窗體中的上一張和下一張時,PictureBox中的圖片會跟著切換,但是切換時卻拋出了如下圖所示的異常:

內存不足?。?!
我一開始的關鍵代碼如下所示:

    private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Image = Image.FromFile(@"f:\圖片\1.jpg");
        }

        string[] path = Directory.GetFiles(@"f:\圖片");
        
        int i = 0;

        private void button2_Click(object sender, EventArgs e)
        {
            i++;
            if (i == path.Length)
            {
                i = 0;
            }
            pictureBox1.Image = Image.FromFile(path[i]);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            i--;
            if (i < 0)
            {
                i = path.Length - 1;
            }
            pictureBox1.Image = Image.FromFile(path[i]);
        }

后來,我在博客園里找問題的答案,找到了如下幾種解決辦法:

<1>釋放內存

每次在PictureBox中顯示完圖像時,將其釋放掉。釋放內存關鍵代碼如下:

    //if (pictureBox1.Image != null)//
    {//    pictureBox1.Image.Dispose();//}
    //或者像下面這樣回收所有資源// GC.Collect();

<2>雙緩沖(類似于GDI+中的雙倍緩沖)
就是創(chuàng)建一個緩沖的“內存庫”來存儲圖像,關鍵代碼如下:

    //Bitmap bmp = new Bitmap(path[i]);  //bmp即相當于一個緩沖的“內存庫”
    //pictureBox1.Image = (Image)bmp;

<3>自己琢磨出來的解決方法
這種方法也可以釋放內存,釋放內存通過bmp和Image的Dispose()方法實現。
上面兩種方法我都試了,可是都還是會拋出異常。后來我經過多次的調試,找到了一種解決問題的辦法,這種辦法我覺得很奇怪,有點匪夷所思。我先把解決問題的代碼展示出來供諸君參考吧,希望看到的大猿能幫我解釋下其中的道理。
我只改了我自己寫的代碼中的“遍歷”的范圍,修改的關鍵部分如下所示:

        private void button2_Click(object sender, EventArgs e)
        {
            i++;
            if (i == path.Length - 1)
            {
                i = 0;
            }
            pictureBox1.Image = Image.FromFile(path[i]);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            i--;
            if (i < 0)
            {
                i = path.Length - 2;
            }
            pictureBox1.Image = Image.FromFile(path[i]);
            GC.Collect();
        }

這種方法既沒有釋放內存,也沒有做緩沖的“內存庫”存圖像,可是程序卻跑的很正常,實在讓人費解其中的道理。希望看到的大猿能給我解釋下這其中的道理,感激不盡!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • 1、窗體 1、常用屬性 (1)Name屬性:用來獲取或設置窗體的名稱,在應用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調閱讀 4,784評論 0 11
  • 1. 林林刷微博的時候,突然收到一條微信消息,打開微信一看,是一條好友添加的消息,備注是周格。 林林按了通過,很快...
    諾然yz閱讀 5,523評論 61 134
  • 茶葉水躺在地上,昨天沒有風吹過,明天所有的堅硬都會干涸。此刻, 白熾燈遇見了彩虹,呼吸遇到了臭氧。世間的 一切感情...
    李一十八閱讀 329評論 0 1
  • spacemacs很好用 最好在mac下用spacemacs spacemacs = vim + emacs s...
    gada閱讀 756評論 0 1

友情鏈接更多精彩內容