C#做图像处理时,什么时候需要重绘?
主要对图像进行放大、缩小、移动、自动播放以及一些简单的画线标记操作,用到双缓冲,是否每一步都要写入重绘函数里面?请高手指教。...
主要对图像进行放大、缩小、移动、自动播放以及一些简单的画线标记操作,用到双缓冲,是否每一步都要写入重绘函数里面?请高手指教。
展开
2个回答
展开全部
每一步都写入重绘也是可以的,但最佳做法是使用剪切区域。
你可以参考http://book.51cto.com/art/200811/98821.htm
我做个简单解释:剪切区域是你只重绘 发生变化的地方
例如你提到的画线,在画线之前,你可以将背景画到一个作为缓冲的Bitmap上,在你画线的过程中,因为背景不会改变,所以只需要直接将缓冲Bitmap绘出,然后再在上层绘制线条即可
这个过程节省了大量的重绘工作,所以会提高性能。。
你可以参考http://book.51cto.com/art/200811/98821.htm
我做个简单解释:剪切区域是你只重绘 发生变化的地方
例如你提到的画线,在画线之前,你可以将背景画到一个作为缓冲的Bitmap上,在你画线的过程中,因为背景不会改变,所以只需要直接将缓冲Bitmap绘出,然后再在上层绘制线条即可
这个过程节省了大量的重绘工作,所以会提高性能。。
展开全部
你应该考虑的是把所有操作的【结果】保存下来
当需要重绘的时候,比如窗口从后面恢复到前面,或者从最小化状态恢复到正常状态时,就把【结果】绘制出来
你的重绘事件响应函数里面应该只有一个工作:不管过程,只绘制结果
当需要重绘的时候,比如窗口从后面恢复到前面,或者从最小化状态恢复到正常状态时,就把【结果】绘制出来
你的重绘事件响应函数里面应该只有一个工作:不管过程,只绘制结果
追问
我刚刚接触图像处理这块,对很多都不熟悉,请问如果我要自动播放一张图片的话,保存的结果应该是什么呢?位移量?还有,这个里面我牵扯到对一幅图片添加标注信息而且能够取消,所以用了双缓冲,这样我就迷糊了,不知道该对哪个图像操作了。请教教我,谢谢!
追答
双缓冲,这是前提?那么简单说下,我不知道你用的哪种方式来实现双缓冲
但是双缓冲的目的都是一样的,是用来防止绘图操作使图像产生闪烁。原理就是两张图,一张在前面显示着,一张在后头画一切画完了再显示,替下来的那张再用来绘图。
无论你用哪种双缓冲,最后都是要达到这样的目的。
那么我们现在正式把你涉及的工作分两部分:
1. 绘制:在后台图像上准备要显示的图像,准备就绪后再显示
2. 显示:在后台图像准备就绪后显示,或者窗口被遮挡过,那就需重新显示需要更新的区域。
这就如你的图片、线条、文字标注是模特,你的程序是画家,屏幕是你的BOSS。画家就是在模特们摆好了POSE之后画下来,然后把画稿EMAIL给BOSS看。
那么下面是两步工作的细节。
绘制:
对于你的画面来说,首先,你的绘图应该是一个针对对象的操作吧?比如,图像、线条、点、文字标注。它们可以放大、缩小、移动,对吧?用户画过哪些东西,画成了什么样子,这个都需要记录下来。这样的话你就可以随时操作每一个部件,比如取消掉标注信息。另外,还有动画,这个你可以暂时先不考虑,押后一点,无非就是再多个时间轴控制而已。
那么绘制流程就是:你的对象列表发生了变化,需要更新;程序就读取所有的图像、线条……;清空掉后台画布;把部件一一画在当前的后台画布上;全部绘制完成后,就把后台画布交到前台,前台画布拿到后台;通知窗口更新显示。
显示:
这个操作就比较简单了,流程如下:
窗口的显示需要更新;程序把当前前台的画布,也就是用来显示的画布显示到窗口中;结束绘制。
补充:这里可以参考limlee回答的使用剪切区域的内容进行优化,只刷新显示需要重绘的区域。不过并不是必须的。
因为不知道你是如何实现的双缓冲,但是原理大体如此的。如果觉得还不明白,我的建议是你先研究一下双缓冲的实现,再去考虑绘制图像部件的事。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询