Winform应用程序处理图像Image时内存不足异常时的处理方法
2015-07-01 10:23
267 查看
在做Winform应用程序处理图像Image时碰到了这样一个问题。窗体设计如下:
当点击上面窗体中的上一张和下一张时,PictureBox中的图片会跟着切换,但是切换时却抛出了如下图所示的异常:
内存不足!!!
我一开始的关键代码如下所示:
View Code
后来,我在博客园里找问题的答案,找到了如下几种解决办法:
<1>释放内存
每次在PictureBox中显示完图像时,将其释放掉。释放内存关键代码如下:
<2>双缓冲(类似于GDI+中的双倍缓冲)
就是创建一个缓冲的“内存库”来存储图像,关键代码如下:
<3>自己琢磨出来的解决方法
这种方法也可以释放内存,释放内存通过bmp和Image的Dispose()方法实现。
上面两种方法我都试了,可是都还是会抛出异常。后来我经过多次的调试,找到了一种解决问题的办法,这种办法我觉得很奇怪,有点匪夷所思。我先把解决问题的代码展示出来供诸君参考吧,希望看到的大猿能帮我解释下其中的道理。
我只改了我自己写的代码中的“遍历”的范围,修改的关键部分如下所示:
View Code
这种方法既没有释放内存,也没有做缓冲的“内存库”存图像,可是程序却跑的很正常,实在让人费解其中的道理。希望看到的大猿能给我解释下这其中的道理,感激不尽!
当点击上面窗体中的上一张和下一张时,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]); }
View Code
后来,我在博客园里找问题的答案,找到了如下几种解决办法:
<1>释放内存
每次在PictureBox中显示完图像时,将其释放掉。释放内存关键代码如下:
//if (pictureBox1.Image != null) //{ // pictureBox1.Image.Dispose(); //} //或者像下面这样回收所有资源 // GC.Collect();
<2>双缓冲(类似于GDI+中的双倍缓冲)
就是创建一个缓冲的“内存库”来存储图像,关键代码如下:
//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(); }
View Code
这种方法既没有释放内存,也没有做缓冲的“内存库”存图像,可是程序却跑的很正常,实在让人费解其中的道理。希望看到的大猿能给我解释下这其中的道理,感激不尽!
相关文章推荐
- C#窗体传值方法总结
- StreamReader读取文件时出现乱码的解决方案
- XmlReader在未知元素的名称和属性的名称的情况下读取属性
- Date String Timestamp之间的相互转化
- DNS服务器
- Acdream 1203 KIDx's Triangle(解三角形)
- 我们应该怎样看待泊松分布???到底什么泊松分布???1。
- 1005. 继续(3n+1)猜想 (25)
- HTTP长连接与短连接
- 初创企业都采用哪种开源协议?
- (转)JavaScript: in, hasOwnProperty, delete, for/in
- Windows下 maven3.0.4的安装步骤+maven配置本地仓库
- C#中图片BYTE[]和base64string的相互转换
- Web安全测试二步走
- Hyper-V 高可用性 (存储配置篇2)
- eclipse查看java方法域
- NGINX引入线程池 性能提升9倍
- android圆角矩形框xml的实现
- codeforces #311 B B. Pasha and Tea(贪心)
- javascript函数笔记