/// <summary>
        /// 部分截图基本类
        /// </summary>
        /// <param name="sbmp"></param>
        public static void PartScreenBasic(ref Bitmap sbmp, Area area)
        {
            sbmp = new Bitmap(area.Width, area.Height);
            //创建图象,保存将来截取的图象
            Graphics imgGraphics = Graphics.FromImage(sbmp);
            //设置截屏区域
            imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
            sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb);
        }
就这一段代码 是没有问题的 对吧?
实际运用时也是没有问题的 外部有个程序在循环调用它 但是每当用个一两个小时 就会在            imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
出错,初步怀疑是系统资源的问题 但是怎么解决一直不得要领 请教高手解法

解决方案 »

  1.   

    是不是没有释放对象呢
    个人意见绿绦工作室 http://www.lvtaostudio.com
      

  2.   

    get screen方法:
     
    Image img = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graphics g = Graphics.FromImage(img);
               
               g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
                    
                MemoryStream ms = new MemoryStream();
                    // pictureBox1.Image = img;
                    
                BinaryFormatter bf = new BinaryFormatter();
                    
                bf.Serialize(ms, img);//客户端反序列化
    byte[] ScreenByte = obj.GetScreen();//obj对象调用以上代码
                MemoryStream ms = new MemoryStream(ScreenByte);
                
                BinaryFormatter bf = new BinaryFormatter();
                pictureBox1.Image=(Image)bf.Deserialize(ms);
               楼主,参考。这是我以前写的代码
      

  3.   

    Image img = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
    Graphics g = Graphics.FromImage(img); 
              
    g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); 
                    
    pictureBox1.Image = img; 
    截屏幕其实就是这么5句话。
      

  4.   

    你咋不用using来释放资源或者自己GC
      

  5.   

                int i = 0;
                System.Drawing.Size sz = new Size(800, 600);
                while (true)
                {
                    using (Bitmap bm = new Bitmap(1, 1))
                    {
                        //创建图象,保存将来截取的图象
                        using (Graphics imgGraphics = Graphics.FromImage(bm))
                        {
                            //设置截屏区域
                            imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);
                   
                        }
                        Console.WriteLine(i);
                        i++;
                    }已经改成这样 还是在9950次左右 提示同样错误 到底是哪里泄漏了?
           
                }
      

  6.   


    using和GC.collect()
    做的事情可不一样哦~
      

  7.   

    Graphics 必须手动释放
    imgGraphics.Dispose();
      

  8.   


     public static void PartScreenBasic(ref Bitmap sbmp, Area area) 
            { 
               // sbmp = new Bitmap(area.Width, area.Height); 
                //创建图象,保存将来截取的图象 
               // Graphics imgGraphics = Graphics.FromImage(sbmp); 
                //设置截屏区域 
               // imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size
    (area.Width, area.Height)); 
             //   sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb);       sbmp.dispose();
              imgGraphics.dispose();
            } 
      

  9.   

            private void button7_Click(object sender, EventArgs e)
            {
                int i = 0;
                System.Drawing.Size sz = new Size(800, 600);
                while (true)
                {
                    using (Bitmap bm = new Bitmap(1, 1))
                    {
                        //创建图象,保存将来截取的图象
                        using (Graphics imgGraphics = Graphics.FromImage(bm))
                        {
                            //设置截屏区域
                            imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);
             
                            imgGraphics.Dispose();
                        }
                        Console.WriteLine(i);
                        i++;
                    }            }
                //return;        }
    内存使用量减少了很多 9950次时原来是45000K左右 现在是39740K 但是还是在9951次时同样错误
    bitmap 不能释放啊 ref传进来的 要回去处理的
    不过我再试试把bitmap也释放看
      

  10.   

    private void button7_Click(object sender, EventArgs e)
            {
                int i = 0;
                System.Drawing.Size sz = new Size(800, 600);
                while (true)
                {
                    Bitmap bm = new Bitmap(1, 1);
                    //创建图象,保存将来截取的图象
                    Graphics imgGraphics = Graphics.FromImage(bm);                //设置截屏区域
                    imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);                bm.Dispose();
                    imgGraphics.Dispose();
                    Console.WriteLine(i);
                    i++;
                }
            }
    万恶的9951 我实在是没办法了 还是在第9951次报错
      

  11.   

    private void button7_Click(object sender, EventArgs e)
            {
                int i = 0;
                System.Drawing.Size sz = new Size(800, 600);
                while (true)
                {
                    Bitmap bm = new Bitmap(1, 1);
                    //创建图象,保存将来截取的图象
                    Graphics imgGraphics = Graphics.FromImage(bm);                //设置截屏区域
                    imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);                bm.Dispose();
                    imgGraphics.Dispose();
                    Console.WriteLine(i);
                    i++;
                }
            }你的程序我跑了一下,的确也是在9951上报“参数无效”
    我修改了一下就好了。但不知道是否满足你的需求private void button7_Click(object sender, EventArgs e)
            {
                int i = 0;
                 Bitmap bm = new Bitmap(1, 1);
                System.Drawing.Size sz = new Size(800, 600);
                while (true)
                {
                    //Bitmap bm = new Bitmap(1, 1);
                    //创建图象,保存将来截取的图象
                    Graphics imgGraphics = Graphics.FromImage(bm);                //设置截屏区域
                    imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);                //bm.Dispose();
                    imgGraphics.Dispose();
                    Console.WriteLine(i);
                    i++;
                }
            }
      

  12.   

      /// <summary> 
            /// 部分截图基本类 
            /// </summary> 
            /// <param name="sbmp"> </param> 
            public static void PartScreenBasic(ref Bitmap sbmp, Area area) 
            { 
                sbmp = new Bitmap(area.Width, area.Height); 
                //创建图象,保存将来截取的图象 
                Graphics imgGraphics = Graphics.FromImage(sbmp); 
                //设置截屏区域 
                imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height)); 
                sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb); 
            } 
        我的程序是这样的 功能是定制截屏 有时可能不止一个bitmap对象
        TKS wdgphc 这样问题肯定出在bitmap对象创建次数太多而释放不完全上 这样的话 可以应该可以在静态类上声明一个全局的bitmap数组 有10个应该足够了 循环使用不创建太多的bitmap 这样的话还要管理这个数组哦 要是能完全解决就好了
        不过这种办法比我现在用的好  呵呵 我现在是直接9000次时重新打开相同程序 并关掉当前程序
        我再研究研究
      

  13.   

    源程序遍地都是bitmap 一下子要改成静态类的共用属性成员 这工作量...
      

  14.   

    建议,对象有Dispose方法的,用完了显式调用这个方法,让CLR及时回收资源
      

  15.   

    ...
    这个里面已经调用了dispose方法了但是还是出错
      

  16.   

    把dispose()写到循环里面,winfrom每次截屏的时候会把图放到缓存里,当缓存溢出的时候会报错或者图片保存不完整。以下有个截图的方法。 
    public void GetImage()//打印屏幕
            {
                try
                {
                    string tempImagePath = Application.StartupPath;
                    string temp = tempImagePath + "\\MonitorImage";
                    Directory.CreateDirectory(@temp);
                    Image i = new Bitmap(this.Width, this.Height);
                    Graphics g = Graphics.FromImage(i);
                    g.CopyFromScreen(new Point(this.Location.X, this.Location.Y), new Point(0, 0), new Size(this.Width, this.Height));
                    i.Save(@temp + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".jpg");
                    g.Dispose();
                    CommonClass.MessageBoxOK("截图成功!");
                }
                catch
                {
                    CommonClass.MessageBoxNo("截图失败!");
                }
            }
      

  17.   

    原来在C#中一个截图程序只要4行代码  ...以前我在C++中写个截屏程序,要把N多个GDI函数了解下,写出来至少500行了,不过我写的那个可以任意画范围
      

  18.   

    这个内存的问题真的解决不了?
    新改的程序只用了一个bitmap 只new了一次 
    使用的时间长了许多但是还是会有内存不足 唉
      

  19.   

    终于解决了 虽然不是在这贴子里
    感谢大家提供的思路
    感谢 wdgphc 兄热情测试