您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> .NET >> C#动态画图关于bitmap设为背景防止闪烁的问题

C#动态画图关于bitmap设为背景防止闪烁的问题

来源:网络整理     时间:2016/5/17 12:09:18     关键词:bitmap

关于网友提出的“C#动态画图关于bitmap设为背景防止闪烁的问题”问题疑问,本网通过在网上对“C#动态画图关于bitmap设为背景防止闪烁的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:C#动态画图关于bitmap设为背景防止闪烁的问题
描述:

之前请教论坛各位,尝试了drawline画图,因为我是从串口10ms读入一个数据,这样每次画图时虽然画上了新点与旧点,但是闪烁的很厉害。看了很多人的例子。认为先画一段,然后将其当为背景,再在背景上画新的一段,再次将图当为背景,以此类推。
现在有个问题是:如果不dispose背景的画,那么就是层层背景叠加,然后显示out of memory的错误。
下面代码在wince开发板上运行没错,但是只画出第一条线;然而当我用button控件打开第二个form窗体,再关掉第二个窗体,回来看时,又出现了后面的线段,每次打开第二个窗体,再回来就出现一个线段。因为第二个窗体并没有与第一个窗体有什么联系。
所以我怀疑,打开第二个窗体再回来的机制是不是一次清理背景内存的操作呢?
刚接触这些,希望有人帮忙解答。
 private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            x[0] = 5;
            y[0] = 50;
            x[1] = 10;
            y[1] = 70;
            Bitmap bmp = new Bitmap(pictureBox1.Image);
     
            pictureBox1.Image.Dispose();//??这里我不清楚对不对,但是不清理的话就会超出内存。
            Graphics g = Graphics.FromImage(bmp);
  
            Pen mypen = new Pen(Color.Red, 1);
                    g.DrawLine(mypen, x[i - 1], y[i - 1], x[i], y[i]);//一些其他的数据时timer控件每10ms给的
                    mypen.Dispose();
                    g.Dispose();
                    pictureBox1.Image = bmp; // 设置为背景层
                   
        }


解决方案1:

引用 7 楼 lgfccc 的回复:
Quote: 引用 6 楼 lc316546079 的回复:

这里图片没必要释放,系统会自动回收,之所以内存不足,是你每次都在创建,建议你做成双缓冲,两张图就够了;
我只是大概写个示例

Pen _penDrawLine;
Point _lastPoint; 
Bitmap _bufImg;
void testDrawPoint()
{
// 绘制初始化(能提前初始化的尽量不放在10ms的高频函数里)
_penDrawLine = new Pen (Color.Red, 1);
_lastPoint = new Point (0, 0);
_bufImg = new Bitmap (1000, 1000);
// 开启模拟线程
Thread th = new Thread (new ThreadStart (sendPoint));
th.Start ();
}
void sendPoint()
{
// 模拟发送新的点
for (int i = 0; i < 1000; i++) {
Thread.Sleep (10);
Random random = new Random();
int x = random.Next (1000);
int y = random.Next (1000);
addPoint (x, y);
}
}
void addPoint(int x, int y)
{
// 将新的线段绘制到缓存图
Point nowPoint = new Point (x, y);
Graphics g = Graphics.FromImage(_bufImg);
g.DrawLine (_penDrawLine, _lastPoint, nowPoint);
g.Dispose ();
_lastPoint = nowPoint;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage (_bufImg,new RectangleF(0,0,_bufImg.Width,_bufImg.Height));
}

您好,您的方法我尝试了一下,因为我是在wince上做应用程序,好像是没有线程这个东西?总是报错,我尝试用timer
,但是picturebox等一些控件找不到双缓冲的属性。
bmp释放的话,那不就没有画图的地方了么,想请教一下具体怎么个释放法,

1,“好像是没有线程这个东西?”
线程是哪里模拟你那里接受串口数据的,不需要,你只要在你接受到串口数据了传给addPoint就行了,
2,“我尝试用timer”
既然不需要那个线程,你也不用尝试用timer了
3,“picturebox等一些控件找不到双缓冲的属性”
我这示例代码就是在比较粗糙的实现双缓冲,不用管picturebox是否有双缓冲
4,“bmp释放的话,那不就没有画图的地方了么,想请教一下具体怎么个释放法”
不释放啊,双缓冲的缓冲图不需要释放,我的示例代码也没释放呀,你之所以会内存溢出就是因为每次都创建图片,10ms一次的频率太高了导致内存释放不及时; 解决方案2:

你先把点放进List里,再定时绘制,而不用每收到一个数据都绘制一遍,人眼根本看不清,没有必要这样干


以上介绍了“C#动态画图关于bitmap设为背景防止闪烁的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1127859.html

相关图片

相关文章