//下面是截图函数
        //重载一,全屏截图
        private Image printScreen()
        {
            //获得当前屏幕的分辨率
            Screen scr = Screen.PrimaryScreen;    //using System.Windows.Forms;   要用这个命令空间
            Rectangle rc = scr.Bounds;
            int iWidth = rc.Width;
            int iHeight = rc.Height;
            //创建一个和屏幕一样大的Bitmap
            Image myImage = new Bitmap(iWidth, iHeight);
            //从一个继承自Image类的对象中创建Graphics对象
            Graphics g = Graphics.FromImage(myImage);
            //抓屏并拷贝到myimage里
            g.CopyFromScreen(0, 0, 0, 0, new Size(iWidth, iHeight));
            return myImage;
        }        //重载二,指定大小截图
        private Image printScreen(int x,int y,int Width,int Height)
        {
            //创建一个和指定长宽一样大的Bitmap
            Image myImage = new Bitmap(Width, Height);
            //从一个继承自Image类的对象中创建Graphics对象
            Graphics g = Graphics.FromImage(myImage);
            //抓屏并拷贝到myimage里
            g.CopyFromScreen(x, y, 0, 0, new Size(Width, Height));
            return myImage;
        }//timer1周期函数            path = lujingtextBox.Text + "\\" + DateTime.Now.ToString().Replace(":", "_") + " " + yiwanchengshuliang.ToString() + ".jpg";
            if (yiwanchengshuliang <= shuliang)
            {
                if (quanpingjietu)
                {
                    printScreen().Save(path);
                }
                else
                {
                    printScreen(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox3.Text) - Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox4.Text) - Convert.ToInt32(textBox2.Text)).Save(path);
                }
                yiwanchengshuliang++;
            }
            else
            {
                timer1.Stop();
            }在FORM1里面添加开始按钮,添加一个timer1时钟,按开始以后 时钟周期为1000毫秒,截图数量是100张,截图范围是全屏,截图完毕自动保存  我编译运行以后 不截图的时候内存占用只有12M  但是我开始截图以后每截一张图,内存占用就增加很多,到100张图全部截完以后,这个程序的内存占用已经达到了800M  请问如何及时释放内存资源?
估计是Image myImage = new Bitmap(iWidth, iHeight); 这一句的原因,每过一秒就new一个估计来不及释放,我去改改语句

解决方案 »

  1.   

    一个屏幕的截图可不小了Graphics对象不使用立即释放
    Bitmap保存后不使用了立即释放。
      

  2.   

    OK  改成功了 把pringscreen那里的定义变量放到外面,点开始截图以后赋值,然后开始,这样就只有一个myImage了  内存占用最高40M  然后一直在31M徘徊 自动截图软件做成功了,需要源码请发消息这个软件没啥功能,就一个自动截图,以后看英文电影的时候设置好,每间隔1秒就截一张图,方便学习英语 
      

  3.   

    image = printScreen();
     printScreen().Save(path);
    image.dispose();
      

  4.   


    private void button1_Click(object sender, EventArgs e)
            {            for (int i = 0; i <= 1000; i++)
                {
                    string path = String.Format(@"D:\testpic\{0:N}.jpg", Guid.NewGuid());
                    printScreen().Save(path);
                }
            
            }
            //下面是截图函数
            //重载一,全屏截图
            private static Image printScreen()
            {
                //获得当前屏幕的分辨率
                Screen scr = Screen.PrimaryScreen; //using System.Windows.Forms; 要用这个命令空间
                Rectangle rc = scr.Bounds;
                int iWidth = rc.Width;
                int iHeight = rc.Height;
                //创建一个和屏幕一样大的Bitmap
                Image myImage = new Bitmap(iWidth, iHeight);
                //从一个继承自Image类的对象中创建Graphics对象
                Graphics g = Graphics.FromImage(myImage);
                //抓屏并拷贝到myimage里
                g.CopyFromScreen(0, 0, 0, 0, new Size(iWidth, iHeight));
                return myImage;
            }改成静态,测试了一下 内存都有释放