问题说明:
写了个钟表程序,表盘是一张图,因为指针作了一张大图,上边有0-359个度数分别的指向状态,利用程序,抓取每一度的指针状态,将背景去除后,贴到表盘上显示出来。
最早的时候,程序加载这张指针状态图,直接就报内存越界退出了,后来把指针状态图从中间分开,放入两个pictruebox中,运行没有问题了。但是现在出现了运行后内存暴涨,最终报错退出的问题。个人分析应该是addImg这个函数导致的,但找不出问题所在,请高手不吝赐教!程序用vs2005C#开发,运行环境wince,ps,发现内存暴涨的问题,是我将程序在windowsxp系统下运行,看任务管理器看来的。主函数如下:
   private void addImg(Image source,Image bg,PictureBox watch,int i)//指针源图,目标背景图,显示的picturebox,指针索引(0-360)
      {Bitmap bitmap=new Bitmap(bg);//目标背景
       Bitmap bmp=new Bitmap(source);//要叠加上的图源
       watch.Image=null;
       int x=0,y=0;
       //第180个指针位于新图的(0,0),因此重新计算
       if(i>=180)
         i-=180;
       x=(i%10)*120;//x点为横向第i%10张图*单张宽度
       y=((int)(i/10))*95;//(int)i/10所得数为第i张图前有多少行,*95图的宽度,则为目标行y坐标       
       Graphics g=Graphics.FromImage(bitmap);
       ImageAttributes imageAttr=new ImageAttributes();
       imageAttr.SetColorKey(Color.FromArgb(255,255,255),Color.FromArgb(255,255,255));//将白色剔出
       g.DrawImage(bmp,              //要叠加上去的图
       new Rectangle(35,35,120,95), //要叠加到背景图的位置,尺寸
       x,y,120,95,        //要叠加源图的起始坐标、的尺寸
       GraphicsUnit.Pixel,imageAttr);       //透明阀值
       watch.Image=(Bitmap)bitmap.Clone();
       // Dispose
       g.Dispose();
       bitmap.Dispose();
       bmp.Dispose();
       ++count;
      }//利用定时器不停的调用上边的函数
    int count=0;
    private void t1_Tick(object sender,EventArgs e)
      {Image img;
       if(count>360)
         {t1.Enabled=false;
          count=0;
          return;
         }
       if(count<180)
         img=pbz1.Image;
       else
         img=pbz2.Image;
       addImg(img,ws.Images[0],pw1,count);
      }如若解决,100分感谢

解决方案 »

  1.   

    在addImg函数的最后加上GC.Collect(0);试试
      

  2.   

    为什么把图Drawing上去?
    PictureBox有两个属性可以利用。
    一个是BackgroundImage,可以放背景图
    一个是Image可以放扣掉背景的指针(最好是透明的png)
    这样背景不用改,每次替换Image前景就可以了。>>>>> 说回你现在的代码://再加上对之前图片的dispose看看。
    Image image = watch.Image;
    watch.Image = null;
    image.Dispose();还有这句:
    watch.Image=(Bitmap)bitmap.Clone();
    先不用Close(),也不对bitmap.Dispose()
    因为下次再生成图片替换它时再Dispose它。
      

  3.   


    有用!但是内存还是大幅增长了。程序运行初始大约占用26mb,当开始执行函数后,峰值达到43mb过
      

  4.   


    picturebox这控件在wince环境下,貌似没有backgroundImage这个属性了。
    您对我代码提出的建议我现在就测试。
    谢谢。