问题说明:
写了个钟表程序,表盘是一张图,因为指针作了一张大图,上边有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分感谢
写了个钟表程序,表盘是一张图,因为指针作了一张大图,上边有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分感谢
解决方案 »
- winform下如何调用系统自带的windows图片查看器打开一幅图形片
- cmpp2.0问题,华为的网关,该如何构造CMPP_CONNECT?
- dataGridView验证问题
- winform:对panel设定自动滚动条,但刷新后总是在原来位置,怎样使刷新后保持原来滚动的位置?
- .net C# (文件接收)
- SlickUpload 是免费使用的吗
- 请教大家一个问题,大家都来看看,来者有分!!!
- 关于SqlServer内Image字段的读取和存贮问题?高分求助
- c#下载文件乱码问题?
- 关于C#取数据的一个问题,请大家帮帮忙啊(急)
- 关于 GDI+ 渐变画刷问题
- 无法将文件“E:\学校教务管理系统\MySchool\Data\DBSchool.mdf”复制到“bin\Release\Data\DBSchool.mdf”。文件“E:\学校教务管理系统\
PictureBox有两个属性可以利用。
一个是BackgroundImage,可以放背景图
一个是Image可以放扣掉背景的指针(最好是透明的png)
这样背景不用改,每次替换Image前景就可以了。>>>>> 说回你现在的代码://再加上对之前图片的dispose看看。
Image image = watch.Image;
watch.Image = null;
image.Dispose();还有这句:
watch.Image=(Bitmap)bitmap.Clone();
先不用Close(),也不对bitmap.Dispose()
因为下次再生成图片替换它时再Dispose它。
有用!但是内存还是大幅增长了。程序运行初始大约占用26mb,当开始执行函数后,峰值达到43mb过
picturebox这控件在wince环境下,貌似没有backgroundImage这个属性了。
您对我代码提出的建议我现在就测试。
谢谢。