2010-10-22 5 views
5

Me gustaría poder extraer la geometría de cada letra en un archivo de fuentes TrueType. Cada letra tendría un conjunto de coordenadas, asumiendo que cada letra está en su propia grilla.Extraer Geometría de la Fuente

Como una imagen vale más que mil palabras - Me gustaría obtener los vértices de cartas similares a la imagen de abajo (cortesía de http://polymaps.org/)

alt text

actualización

Gracias a

la sugerencia de usar GDI, que ahora se incorpora a .NET System.Drawing.Drawing2D Obtuve el siguiente código para crear polígonos WKT. No hay curvas bezier posibles. E incluso después de que las letras se voltearan y giraran, algunos caminos aún no se unirían correctamente.

 // 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

Supongo que sería muy fácil sacar algo de texto en Adobe Illustrator y convertir el texto en una ruta. Sin embargo, esto es más una pregunta para superuser.com. –

+0

Esperaba hacerlo sin un paquete de software costoso, y construido alrededor de un script reutilizable – geographika

+2

sobre su 'A' que parece incorrecta: El problema es que hay dos rutas. Además de PathData, tendrá que mirar la matriz paralela PathTypes http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.pathtypes.aspx. Cuando el tipo de un punto es 0, tendrá que cerrar la última figura y comenzar una nueva. –

Respuesta

2

Para Windows, puede usar Gdiplus. Cree un GraphicsPath y llame a AddString() en él.

Luego examine PathData o PathPoints.

2

alt text

En Adobe Illustrator

Object Menu > Expand... 

Esto convertirá el texto en trazados hechos de los anclajes y las curvas de Bézier.

Además de utilizar una aplicación, no sé cómo hacerlo mediante programación.

+0

Muy agradable. Nunca utilicé Illustrator, pero veo que hay una versión de prueba disponible para descargar. ¿Incluye un lenguaje de scripting para extraer las coordenadas al texto? – geographika

+0

Lamentablemente, no sé la respuesta a eso :( –

0

Tal vez pueda utilizar una biblioteca de fuentes como FreeType 2 para decodificar la fuente?

0

Inkscape es gratis e incluye text to path functionality. Algunas funcionalidades de Inkscape son controladas por comandos, pero no sé si eso resolverá su problema exactamente. El formato nativo de Inkscape es SVG.

0

Necesitaba la salida en MATLAB, por lo que tomé la respuesta correcta con la interfaz MATLAB.NET. Código fuente publicado debajo de

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) 
Cuestiones relacionadas