【发布时间】:2010-10-22 18:51:21
【问题描述】:
我希望能够提取 TrueType 字体文件中每个字母的几何图形。假设每个字母都在自己的网格中,每个字母都有一组坐标。
正如一张图片告诉一千个单词 - 我想获得类似于下图的字母的顶点(http://polymaps.org/ 提供)
更新
感谢使用 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());
【问题讨论】:
-
我猜在 Adobe Illustrator 中弹出一些文本并将文本转换为路径会很容易。不过,这对于 superuser.com 来说更像是一个问题。
-
我希望在没有昂贵的软件包的情况下做到这一点,并围绕可重用的脚本构建
-
关于您的“A”看起来不正确:问题是有两条路径。除了 PathData,您还需要查看并行数组 PathTypes msdn.microsoft.com/en-us/library/… 。当一个点的类型为 0 时,您需要关闭最后一个图并开始一个新的。
-
哦,你也可以在 GraphicsPath 上调用“Flatten()”来将贝塞尔曲线转换成直线段。
标签: .net vector fonts geometry extract