I'd like to be able to extract the geometry for each letter in a TrueType font file. Each letter would have a set of coordinates, assuming each letter is in its own grid.
As a picture tells a thousand words - I'd like to get the vertices for letters similar to the image below (courtesy of http://polymaps.org/)
Update
Thanks to the hint to use GDI, which is now incorporated into .NET System.Drawing.Drawing2D I got the following code to create WKT polygons. No bezier curves possible. And even after the letters were flipped and rotated some paths still would not join correctly.
// 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(); 开发者_StackOverflow社区//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());
For Windows, you can use Gdiplus. Create a GraphicsPath and call AddString() on it.
Then examine the PathData or PathPoints.
I needed the output in MATLAB so took the correctly marked answer using the MATLAB.NET interface. Source code posted below
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)
In Adobe Illustrator
Object Menu > Expand...
This will convert the text to paths made of anchors and Bezier curves.
Aside from using an application, I don't know how to do this programmatically.
Inkscape is free and includes text to path functionality. Some Inkscape functionality is command driven, but I don't know whether that will handle your problem exactly. Inkscape's native format is SVG.
精彩评论