Схема текста в виде однострочного векторного пути
Для приложения мне нужно нарисовать текст / глифы в виде векторного пути. Использование GDI + GraphicsPath и Graphics.DrawPath или WPF FormattedText и Geometry работает нормально, и я получаю вывод, как показано на первом рисунке. Но возможно ли каким-то образом получить буквы в виде однострочного пути, как показано на втором рисунке (показано L).
Я рад, если у кого-нибудь есть идея.
Смотрите этот пример. Использование встроенной функции всегда даст вам путь к письму, содержащему его внутреннюю и внешнюю границу. Только первый состоит из одиночных ударов, что приводит к гораздо более короткому пути.
1 ответ
@Matthias Шрифты с одним штрихом определяются сами по заполненной области шрифта. TTF (контурные) шрифты определяют каждый символ штрихом, окружающим заполненную область. Итак, они обязательно образуют замкнутую форму. Другими словами, невозможно иметь контурный шрифт с "истинным одиночным штрихом", потому что у одношаговых шрифтов есть только заполненная область..NET Framework поддерживает только шрифты TTF.
К счастью, есть некоторые шрифты, которые имитируют поведение одного удара, закрывая контуры штрихов на себе. В основном они используются программным обеспечением для черчения с ЧПУ. Вот ссылка на zip-файл, содержащий те же шрифты, которые @Simon Mourier предложил использовать.
Я экспериментировал с первым, и действительно я не мог видеть отдельный путь для закрытых областей. Я написал некоторый код, который делает штрихи обычного шрифта близкими к себе, но изогнутые области исчезают в некоторых местах. Какой бы внутренний алгоритм.NET не пытался создать 1-пиксельный путь из сжатого контура, он не работает так же хорошо, как использование хорошо разработанного шрифта. Итак, это так же хорошо, как это будет использовать.NET.
Вы можете использовать этот код, чтобы увидеть, что каждый шрифт производит после их установки. Или, я думаю, вы могли бы просто попробовать их в своем программном обеспечении:) В любом случае, я надеюсь, что это полезно для вас.
Это вывод Graphics.DrawPath
НЕ Graphics.FillPath
,
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/