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