C# 如何选择、显示和保存图形区域?

C# 如何选择、显示和保存图形区域?,c#,winforms,graphics,C#,Winforms,Graphics,现在的情况是:我需要一个(用户指定的)图形,并允许用户定义和标记该图形中的区域。例如,如果你上传了一张脸的图片,你可能想定义“右眼”、“左眼”、“鼻子”等。此外,在定义了区域后,如果我选择了先前定义的区域,它应该以某种方式在图像上高亮显示。这些区域(显然)不一定是矩形的,它们不能重叠。如果您在图形中的某个定义区域内单击,我将能够识别单击的区域 我可以想出几种方法来做这件事,但没有一种是令人满意的。我之前的另一位开发人员尝试在原始图形上覆盖一个透明的网格,摆弄背景alpha/颜色以突出显示区域,但

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

我可以想出几种方法来做这件事,但没有一种是令人满意的。我之前的另一位开发人员尝试在原始图形上覆盖一个透明的网格,摆弄背景alpha/颜色以突出显示区域,但我认为他们相当笨拙。我可以尝试清理他们的代码,或者尝试一种全新的方法

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


Bounty添加了:以获得能让我在最短时间内启动和运行的最佳解决方案。

您需要多边形,保存为点列表。你需要对他们进行命中测试。请参阅链接:


GraphicsPath类就是为了实现这一点而设计的。在图像中保留它们的列表。首先绘制图像,然后是Graphics.DrawPath()以绘制图像顶部的区域


使用GraphicsPath.IsVisible()进行命中测试很简单。以相反的顺序重复列表,以便重叠工作。

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


但是,如果您直到现在还没有使用WPF或Silverlight,那么在学习基本概念和API时会有一些开销;因此,在不了解您(或其他人)的能力的情况下,我恐怕无法将其推荐为最高速度解决方案。也就是说,对我来说,使用MVVM和WPF绝对是速度最高的解决方案。此外,WPF还提供了最大的用户友好性,因为WPF提供了非常有趣的开箱即用的交互模型,如多点触摸支持(这是应该提到的流行趋势,对吧?)和简单的非标准布局和控件放置。

我看到了现在的优势。你愿意对我的答案发表评论吗?好的,这个答案对我来说是最有用的信息,所以你得到了赏金。谢谢!:)啊,对了——我以前没有在新制度下颁发过赏金。谢谢你提醒我!:)