如何填充排除某些区域(路径)的路径 C# Graphics
How to Fill a path excluding certain areas(paths) C# Graphics
我现在正在开发一个 Windows 表单 C# 应用程序,它使用 dlib (https://github.com/takuya-takeuchi/DlibDotNet)
检测你的脸
它用 Points
获得了 68 个人脸特征点
面部地标及其点:
因此,我为嘴唇、鼻子、眼睛和眉毛制作了一个图形路径,以及一条环绕整个脸部的路径,我的问题是,是否可以减去眼睛、眉毛、嘴唇和从覆盖所有面部的鼻子路径到绘制所有面部 "excluding" 那些区域?
我发现这在 xaml 中是可行的:
(https://docs.microsoft.com/en-us/visualstudio/designers/draw-shapes-and-paths?view=vs-2017)
那么是否可以在 C# 中使用图形路径和位图执行 ExcludeOverlap 或 Substract?
如果是的话怎么办?
(我知道这几乎是 post 一些代码的潜规则,但我基本上所做的是为脸部的每个部分创建一个图形路径,然后用 [=30 在位图上绘制它们=]())
可不可以把覆盖全脸的眼睛、眉毛、嘴唇和鼻子的路径减去画全脸"excluding"那些区域?
这不仅是可能的;事实上,这是组合的默认设置 GraphicsPaths
:您将较小的内部路径添加到较大的外部路径,当您填充它时,它们将是空洞。
然而,当您在 'holes' 上覆盖更多路径时,不会发生这种情况,从而导致孔内出现正区域。
要使所有路径加法组合(或 -ing),您可以将FillMode
属性更改为Winding
。默认值为“Alternative”,它将创建空洞(Xor -ing 区域。)
要获得完全控制权,您可以使用 Regions
。它们可以随意组合成整套集合操作。但是它们不支持抗锯齿,所以曲线和斜线看起来很粗糙。
示例:
private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
GraphicsPath gp0 = new GraphicsPath();
GraphicsPath gp1 = new GraphicsPath();
GraphicsPath gp2 = new GraphicsPath();
GraphicsPath gp3 = new GraphicsPath();
GraphicsPath gp4 = new GraphicsPath();
gp0.AddEllipse(11, 11, 333, 333);
gp1.AddEllipse(55, 55, 55, 55);
gp2.AddEllipse(222, 55, 66, 66);
gp3.AddEllipse(55, 222, 99, 222);
gp4.AddLine(66, 123, 234, 77);
using (Pen pen = new Pen(Color.Empty, 12f))
gp4.Widen(pen);
gp0.AddPath(gp1, true);
gp0.AddPath(gp2, true);
gp0.AddPath(gp3, true);
gp0.AddPath(gp4, true);
gp0.FillMode = FillMode.Alternate;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillPath(Brushes.Goldenrod, gp0);
}
我现在正在开发一个 Windows 表单 C# 应用程序,它使用 dlib (https://github.com/takuya-takeuchi/DlibDotNet)
检测你的脸
它用 Points
面部地标及其点:
因此,我为嘴唇、鼻子、眼睛和眉毛制作了一个图形路径,以及一条环绕整个脸部的路径,我的问题是,是否可以减去眼睛、眉毛、嘴唇和从覆盖所有面部的鼻子路径到绘制所有面部 "excluding" 那些区域?
我发现这在 xaml 中是可行的:
(https://docs.microsoft.com/en-us/visualstudio/designers/draw-shapes-and-paths?view=vs-2017)
那么是否可以在 C# 中使用图形路径和位图执行 ExcludeOverlap 或 Substract? 如果是的话怎么办?
(我知道这几乎是 post 一些代码的潜规则,但我基本上所做的是为脸部的每个部分创建一个图形路径,然后用 [=30 在位图上绘制它们=]())
可不可以把覆盖全脸的眼睛、眉毛、嘴唇和鼻子的路径减去画全脸"excluding"那些区域?
这不仅是可能的;事实上,这是组合的默认设置 GraphicsPaths
:您将较小的内部路径添加到较大的外部路径,当您填充它时,它们将是空洞。
然而,当您在 'holes' 上覆盖更多路径时,不会发生这种情况,从而导致孔内出现正区域。
要使所有路径加法组合(或 -ing),您可以将FillMode
属性更改为Winding
。默认值为“Alternative”,它将创建空洞(Xor -ing 区域。)
要获得完全控制权,您可以使用 Regions
。它们可以随意组合成整套集合操作。但是它们不支持抗锯齿,所以曲线和斜线看起来很粗糙。
示例:
private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
GraphicsPath gp0 = new GraphicsPath();
GraphicsPath gp1 = new GraphicsPath();
GraphicsPath gp2 = new GraphicsPath();
GraphicsPath gp3 = new GraphicsPath();
GraphicsPath gp4 = new GraphicsPath();
gp0.AddEllipse(11, 11, 333, 333);
gp1.AddEllipse(55, 55, 55, 55);
gp2.AddEllipse(222, 55, 66, 66);
gp3.AddEllipse(55, 222, 99, 222);
gp4.AddLine(66, 123, 234, 77);
using (Pen pen = new Pen(Color.Empty, 12f))
gp4.Widen(pen);
gp0.AddPath(gp1, true);
gp0.AddPath(gp2, true);
gp0.AddPath(gp3, true);
gp0.AddPath(gp4, true);
gp0.FillMode = FillMode.Alternate;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillPath(Brushes.Goldenrod, gp0);
}