如何选择,显示和保存图形区域?

时间:2010-08-19 15:14:31

标签: c# winforms graphics

所以情况就是这样:我需要采用(用户指定的)图形,并允许用户定义和标记该图形中的区域。例如,如果你上传了一张脸的图片,你可能想要定义“右眼”,“左眼”,“鼻子”等。另外,定义了区域,如果我选择一个先前定义的区域,它应该是以某种方式在图像上突出显示。这些区域(显然)不一定是矩形,并且它们不能重叠。如果您在图形中的已定义区域内单击,我将能够识别单击了哪个区域。

有几种方法我可以想到这样做,但没有一种方法令人满意。在我之前的另一位开发人员尝试使用覆盖在原始图形上的透明网格进行操作,摆弄背景alpha /颜色以突出显示区域,但我认为他们相当克服了它。我可以试着清理他们的代码,或尝试一种全新的方法让我的手非常脏。

您对最高速度和用户友好性有什么建议?

Bounty补充道:是最佳解决方案,可让我在最短的时间内投入使用。

3 个答案:

答案 0 :(得分:2)

使用GraphicsPath类来执行此操作。保留它们的列表以及图像。首先绘制图像,然后绘制Graphics.DrawPath()以在图像顶部绘制区域。

使用GraphicsPath.IsVisible()进行测试很简单。以相反的顺序迭代列表,因此重叠工作。

答案 1 :(得分:1)

假设您尚未确定您将使用的技术,我建议使用WPF;我发现大多数与图形相关的任务更容易使用WPF(至少在版本4中)并且它专门针对交互性,因此使用鼠标点击创建非矩形区域和点击测试点击来选择形状将非常容易。加载图像也很容易。

但是,如果您到目前为止还没有使用过WPF或Silverlight,那么学习基本概念和API会有一些开销;所以我担心没有真正的方法可以推荐它作为最高速度的解决方案,而不知道你(或谁将会合作)的能力。也就是说,使用MVVM和WPF绝对是我的最高速度解决方案。自WPF以来,最大的用户友好性使得非常有趣的交互模型能够开箱即用,例如多点触控支持(这是应该提及的时尚产品,对吧?)以及简单的非标准布局和控件放置。

答案 2 :(得分:0)

您需要保存为点列表的多边形。而且你需要对它们进行命中测试。见链接:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/40ebadc1-6154-4c7c-9cb1-d608a426b29c