如何填充排除某些区域(路径)的路径 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);
}