Извлечь геометрию из шрифта - PullRequest
7 голосов
/ 22 октября 2010

Я хотел бы иметь возможность извлекать геометрию для каждой буквы в файле шрифта TrueType. Каждая буква будет иметь набор координат, при условии, что каждая буква находится в своей сетке.

Как картинка говорит тысячу слов - я хотел бы получить вершины для букв, аналогичных изображению ниже (любезно предоставлено http://polymaps.org/)

alt text

Обновление

Благодаря подсказке использовать GDI, который теперь включен в .NET System.Drawing.Drawing2D, я получил следующий код для создания WKT-полигонов. Кривые Безье не возможны. И даже после того, как буквы были перевернуты и повернуты, некоторые пути все равно не могли соединиться правильно.

        // C# Visual Studio

        GraphicsPath gp = new GraphicsPath();

        Point origin = new Point(0, 0);
        StringFormat format = new StringFormat();
        FontFamily ff = new FontFamily("Arial");
        //enter letter here
        gp.AddString("T", ff, 0, 12, origin, format); //ABCDEFGHIJKLMNOPQRSTUVWXYZ

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("DECLARE @g geometry;");
        sb.Append("SET @g = geometry::STGeomFromText('POLYGON ((");


        Matrix flipmatrix = new Matrix(-1, 0, 0, 1, 0, 0);
        gp.Transform(flipmatrix);
        Matrix rotationtransform = new Matrix();

        RectangleF r = gp.GetBounds();

        // Get center point
        PointF rotationPoint = new PointF(r.Left + (r.Width / 2), r.Top + (r.Height / 2));
        rotationtransform.RotateAt(180, rotationPoint);
        gp.Transform(rotationtransform);
        //gp.CloseAllFigures(); //make sure the polygon is closed - does not work

        foreach (PointF pt in gp.PathData.Points)
        {
            sb.AppendFormat("{0} {1},", pt.X, pt.Y);

        }
        PointF firstpoint = gp.PathData.Points[0];

        sb.AppendFormat("{0} {1}", firstpoint.X, firstpoint.Y); //make last point same as first
        sb.Append("))',0);");
        sb.AppendLine("");
        sb.AppendLine("SELECT @g");
        System.Diagnostics.Debug.WriteLine(sb.ToString());

alt text alt text

Ответы [ 5 ]

3 голосов
/ 22 октября 2010

Для Windows вы можете использовать Gdiplus. Создайте GraphicsPath и вызовите AddString () для него.

Затем проверьте PathData или PathPoints.

2 голосов
/ 22 октября 2010

alt text

В Adobe Illustrator

Object Menu > Expand...

Это преобразует текст в пути из якорей и кривых Безье.

Помимо использования приложения, я не знаю, как это сделать программно.

0 голосов
/ 01 января 2017

Мне нужен был вывод в MATLAB, поэтому я получил правильно помеченный ответ, используя интерфейс MATLAB.NET. Исходный код размещен ниже

clear all
% Import .NET Framework System.Drawing
NET.addAssembly('System.Drawing');      

% Display all available System Fonts (optional)
    AvailableFonts = System.Drawing.Text.InstalledFontCollection();
    for i=1:AvailableFonts.Families.Length
        disp(AvailableFonts.Families(i).Name);
    end

% Get GraphicsPath of chosen Font and text string
% https://msdn.microsoft.com/en-us/library/ms142533(v=vs.110).aspx

FontData= System.Drawing.Drawing2D.GraphicsPath();

text='Hello World';
font=System.Drawing.FontFamily('Arial');
style=cast(System.Drawing.FontStyle.Regular,'Int32');
emSize=48;
origin=System.Drawing.Point(0,0);
format=System.Drawing.StringFormat();

FontData.AddString(text,font,style,emSize,origin,format);

%Extract X,Y data from FontData

for i=1:FontData.PathPoints.Length
    x(i)=FontData.PathPoints(i).X;
    y(i)=-FontData.PathPoints(i).Y; 
end

plot(x,y)
0 голосов
/ 23 октября 2010

Inkscape является бесплатным и включает в себя функциональность текста в пути .Некоторые функции Inkscape управляются командами, но я не знаю, точно ли это решит вашу проблему.Формат Inkscape - SVG.

0 голосов
/ 22 октября 2010

Может быть, вы можете использовать библиотеку шрифтов, такую ​​как FreeType 2 для декодирования шрифта?

...