• Winform应用程序处理图像Image时内存不足异常时的处理方法


    在做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]);
            }
    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

    这种方法既没有释放内存,也没有做缓冲的“内存库”存图像,可是程序却跑的很正常,实在让人费解其中的道理。希望看到的大猿能给我解释下这其中的道理,感激不尽!

    如果你无法简洁的表达你的想法,那只说明你还不够了解它。
  • 相关阅读:
    eclipse/myeclipse介绍
    HDU 5802 Windows 10
    LaTeX test
    数据结构2 静态区间第K大/第K小
    数据结构1 「在线段树中查询一个区间的复杂度为 $O(log N)$」的证明
    HDU 1007 Quoit Design
    HDU 5761 Rower Bo
    hihocoder #1341 Constraint Checker
    HDU #5733 tetrahedron
    hihocoder #1327
  • 原文地址:https://www.cnblogs.com/zhuochangjing/p/3918568.html
Copyright © 2020-2023  润新知