2010-10-22 2 views
5

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

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

alt text

Update

Благодаря намек на использование 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

+0

Я предполагаю, что было бы довольно легко поместить некоторый текст в Adobe Illustrator и преобразовать текст в путь. Это скорее вопрос для superuser.com. –

+0

Я надеялся сделать это без дорогостоящего пакета программного обеспечения и построил вокруг многоразового скрипта – geographika

+2

о вашем «A», который выглядит некорректно: проблема в том, что существует два пути. В дополнение к PathData вам необходимо посмотреть на параллельный массив PathTypes http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.pathtypes.aspx. Когда тип точки равен 0, вам нужно закрыть последнюю цифру и начать новую. –

ответ

2

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

Затем изучите PathData или PathPoints.

2

alt text

В Adobe Illustrator

Object Menu > Expand... 

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

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

+0

Очень приятно. Никогда не использовал Illustrator, но я вижу, что есть пробная версия, доступная для загрузки. Включает ли он язык сценариев для извлечения координат в текст? – geographika

+0

К сожалению, я не знаю ответа на этот вопрос :( –

0

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

0

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

0

Мне нужен был выход в 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) 
Смежные вопросы