文本的概述作为单行传染媒介道路的

时间:2012-12-10 09:02:22

标签: c# text gdi+ glyph

对于应用程序,我需要将文本/字形绘制为基于矢量的路径。使用GDI+ GraphicsPath和Graphics.DrawPath或WPF FormattedText和Geometry工作正常,我得到输出,如第一张图片所示。但是在某种程度上可以将字母作为单行路径,如第二张图所示(显示L)。

如果有人有想法,我很高兴。

Text outline Single line glyph path

请参阅此示例。使用内置函数将始终为您提供包含其内部和外部边界的字母的路径。只有第一个由单个笔划构成,这导致更短的路径。

enter image description here

1 个答案:

答案 0 :(得分:4)

@Matthias单笔划字体由字体的填充区域定义。 TTF(轮廓)字体通过填充区域周围的笔划定义每个字符。因此,他们必然形成一个封闭的形状。换句话说,不可能有一个“真正的单笔画”轮廓字体,因为单笔画字体只有一个填充区域。 .NET Framework仅支持TTF字体。

幸运的是,有些字体通过关闭自身的轮廓笔划来模拟单笔画行为。大多数情况下,它们被CNC绘图软件使用。这是zip文件的link,其中包含@Simon Mourier建议使用的相同字体。

我尝试了第一个,实际上我看不到封闭区域的单独路径。我写了一些代码,使常规字体的笔划接近自己,但曲线区域在某些位置消失。无论.NET使用哪种内部算法尝试从压扁的轮廓创建1px路径,都不如使用精心设计的字体。所以,这就像使用.NET一样好。

您可以使用此代码查看安装后每种字体产生的内容。或者,我想你可以在你的软件中尝试它们:)无论哪种方式,我希望这对你有用。

这是Graphics.DrawPath的输出,而不是Graphics.FillPath

enter image description here

    private void button1_Click(object sender, EventArgs e) {
        DrawText("single stroke ttf engraving fonts");
    }

    private void DrawText(string text) {
        using (Graphics g = panel.CreateGraphics())
        using (Font font = new System.Drawing.Font("1CamBam_Stick_1", 50, FontStyle.Regular))
        using (GraphicsPath gp = new GraphicsPath())
        using (StringFormat sf = new StringFormat()) {
            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;

            gp.AddString(text, font.FontFamily, (int)font.Style, font.Size, panel.ClientRectangle, sf);
            g.Clear(Color.Black);
            g.DrawPath(Pens.Red, gp);
        }
    }

此外,如果您计划进行大量此操作,请阅读以下相关文章。 http://tipsandtricks.rolanddga.com/software/how-to-generate-single-line-fonts-for-use-with-dr-engrave/