C#做图像处理时,什么时候需要重绘?

主要对图像进行放大、缩小、移动、自动播放以及一些简单的画线标记操作,用到双缓冲,是否每一步都要写入重绘函数里面?请高手指教。

每一步都写入重绘也是可以的,但最佳做法是使用剪切区域。
你可以参考http://book.51cto.com/art/200811/98821.htm

我做个简单解释:剪切区域是你只重绘 发生变化的地方
例如你提到的画线,在画线之前,你可以将背景画到一个作为缓冲的Bitmap上,在你画线的过程中,因为背景不会改变,所以只需要直接将缓冲Bitmap绘出,然后再在上层绘制线条即可

这个过程节省了大量的重绘工作,所以会提高性能。。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-01-14
你应该考虑的是把所有操作的【结果】保存下来
当需要重绘的时候,比如窗口从后面恢复到前面,或者从最小化状态恢复到正常状态时,就把【结果】绘制出来
你的重绘事件响应函数里面应该只有一个工作:不管过程,只绘制结果追问

我刚刚接触图像处理这块,对很多都不熟悉,请问如果我要自动播放一张图片的话,保存的结果应该是什么呢?位移量?还有,这个里面我牵扯到对一幅图片添加标注信息而且能够取消,所以用了双缓冲,这样我就迷糊了,不知道该对哪个图像操作了。请教教我,谢谢!

追答

双缓冲,这是前提?那么简单说下,我不知道你用的哪种方式来实现双缓冲
但是双缓冲的目的都是一样的,是用来防止绘图操作使图像产生闪烁。原理就是两张图,一张在前面显示着,一张在后头画一切画完了再显示,替下来的那张再用来绘图。
无论你用哪种双缓冲,最后都是要达到这样的目的。

那么我们现在正式把你涉及的工作分两部分:
1. 绘制:在后台图像上准备要显示的图像,准备就绪后再显示
2. 显示:在后台图像准备就绪后显示,或者窗口被遮挡过,那就需重新显示需要更新的区域。
这就如你的图片、线条、文字标注是模特,你的程序是画家,屏幕是你的BOSS。画家就是在模特们摆好了POSE之后画下来,然后把画稿EMAIL给BOSS看。

那么下面是两步工作的细节。
绘制:
对于你的画面来说,首先,你的绘图应该是一个针对对象的操作吧?比如,图像、线条、点、文字标注。它们可以放大、缩小、移动,对吧?用户画过哪些东西,画成了什么样子,这个都需要记录下来。这样的话你就可以随时操作每一个部件,比如取消掉标注信息。另外,还有动画,这个你可以暂时先不考虑,押后一点,无非就是再多个时间轴控制而已。
那么绘制流程就是:你的对象列表发生了变化,需要更新;程序就读取所有的图像、线条……;清空掉后台画布;把部件一一画在当前的后台画布上;全部绘制完成后,就把后台画布交到前台,前台画布拿到后台;通知窗口更新显示。

显示:
这个操作就比较简单了,流程如下:
窗口的显示需要更新;程序把当前前台的画布,也就是用来显示的画布显示到窗口中;结束绘制。
补充:这里可以参考limlee回答的使用剪切区域的内容进行优化,只刷新显示需要重绘的区域。不过并不是必须的。

因为不知道你是如何实现的双缓冲,但是原理大体如此的。如果觉得还不明白,我的建议是你先研究一下双缓冲的实现,再去考虑绘制图像部件的事。

本回答被提问者采纳

C#绘图问题,关于重绘
1、form_load方法里调用绘图方法,绘出图来,然后paint函数重绘,因为没有写,所以就全部图不见了,所以其实就是一闪而过的图。buttonclick调用绘图方法可以绘图,是因为绘出图来,没有执行paint函数重绘 2、关于重绘的问题,我以为也试过很多种方法,最后到目前为止,也只是能在paint函数里实现。如果你...

C#中图形的重绘问题
如果你是一启动就显示你画的那些图形就可以通过重绘这个方法:protected override void OnPaint(PaintEventArgs e){ base.OnPaint(e);\/\/在此添加你绘图的那些代码;} 如果你是通过按了Button再显示画图的,那么你可以在你绘图代码的最后加上这句代码:this.Update();试试看....

c# GDI+画线问题求助
这个问题,你要算出在哪个位置进行画方块,当mouse移动的时,你要进行判断,mouse point 是不是在你那个方块区域附近,如果靠近的话,那你这时就要进行重绘,将方块显示出来。方块对象要判断是否按住了,如按住就要开始移动。其实 都是Graphic的重绘,在 特定时间进行绘制全部,给人一种移动的感觉 ...

C#中自绘图形的重绘
简单的可以在窗体的Activated事件中,重新调用绘图函数。如果参数很多,太麻烦的话,可以这样。绘图的时候,把图形绘制到picture中,把picture放在窗体上,这样图形始终在内存中保留。无论如何切换窗口,图形都不会消失。具体绘图方法:引用如下命名空间:using System.Drawing;using System.Drawing.Imaging;申明...

在C#中窗体中添加一个PictureBox控件的重绘问题
我没有遇到这样的情况,可能是机器运行有点慢吧。一般情况下都会自动重绘的,如果不自动重绘的话,你可以让它重绘。调用菜单栏之后,调用PictureBox.Refresh();

C# 保存出来的图片是黑色的
需要在激活的时候重画才行 自己做的控件往往会忘记这个事情 一般是Refresh()函数

C# 画图 窗体重绘
设一个bool型的全局变量.比如 bool flag = false;onpaint里用 if(flag){ \/\/drawpic } 按钮事件里 flag = true;想让图片消失就把flag改成false即可

c#中绘画的东西在 panel中 显示
void Invalidate( BOOL bErase = TRUE );该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处...

c#如何阻止重绘
窗体启动、最小化、最大化等都会导致重绘,即执行Paint事件,这是无法阻止的,但是你可以在Paint事件里if 一下

c#画图问题 窗口改变图会有重影 panel画图有paint事件,图形大小随着...
去查查paint事件触发的条件吧,几乎所有的界面发生改变的时候都会触发这个事件,所以很清楚了

相似回答