使用字形对象| .NET

在编码字体时,使用字形与其单元一样至关重要。当 是什么是字体段落的 Artract中解释有关字形的基本信息时,我们将在这里教您Aspose.font的功能。

字形对象

任何字体的字形以 glyph在aspose.font库中键入。 因此, glyph类型是字体字形的通用对象,独立于字体格式(trueType,compact字体格式等)。

字形对象提供的功能

这个对象为我们提供什么功能?

它的属性回答了这个问题。

此 示例在字体大小为 10 时累加文本 “Hello world” 的字形前进宽度,不包含字形对字距调整。结果与字体大小使用相同的单位;如果大小以像素指定,结果就是像素宽度。

在文件的头部添加下一个名称空间:

1    using Aspose.Font;
2    using Aspose.Font.Glyphs;

运行代码片段前,请准备一个名为 font 的已加载 Aspose.Font.Font 对象。测试从 DataDir 加载 TTF/LatoWeb-Regular.ttf,其中 DataDir 指向示例项目中的 tests-data/Aspose.Font。加载时使用 Font.Open,并传入 FontDefinition、FontType.TTF 和 FileSystemStreamSource。在应用程序中,请使用您自己的字体数据目录。这些加载准备工作不包含在代码片段中。

以下示例使用 UnicodeToGid 将每个 Unicode 字符映射到对应字形,并累加缩放后的前进宽度。对于提供的 Lato 字体,结果为 50.99:

 1// Calculate text width from glyph advances
 2
 3const string text = "Hello world";
 4const int fontSize = 10;
 5double width = 0;
 6
 7// Sum glyph advances at the requested size, without pair kerning.
 8foreach (char symbol in text)
 9{
10    GlyphId gid = font.Encoding.UnicodeToGid(symbol);
11    Glyph glyph = font.GetGlyphById(gid);
12    width += ((double)glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
13}

要获得字形的边界框,请使用 glyphbbox glyph对象的属性。

要获得字形的视觉表示,您需要了解所有字形的坐标。

如何从字形对象中获取所有字形点的坐标?

接下来的属性 IsEmpty 和 Path 就是为这种情况设计的。

属性 Isempty是辅助。它告诉我们,字形的路径是空的,换句话说,字形根本没有绘图说明。如果它具有值 false,则该使用非常有用的属性 *路径 *构造整个字形的数字了。

在Aspose.font库的概念中,任何字形的表示形式都分为最简单的图形原始图,称为semgments,并由接口 ipathsegment表示。 接口 iPathseggent是一个基本的抽象图形原始。

混凝土图形原始词由 Moveto, lineto, curveto和 ClosePath等类型表示。

类型 ClosePath 用于指示当前图形轮廓的结束。

类型 MoveTo、LineTo 和 CurveTo 的定义与相同的后记运算符相对应。

此外,类型 MoveTo 和 LineTo 的定义对应于 Windows GDI 库中的函数 MoveToEx() 和 LineTo(),类型 CurveTo 用于描述 Bézier 曲线。

Glyph 属性 Path 为我们提供了该字形的所有图形基元的集合。

属性路径具有类型 segmentPath,并且此类型的每个对象都具有属性 sengments的类型 PathSegmentSegrection Collection。此属性 *段 *返回所有object segmentpath包含的图形原始图。换句话说,我们可以使用条目Glyph.path.segments获取字形的所有图形原始图。

此 示例将路径端点和 Bézier 控制点收集到 points 中,这是一个由 point 类型对象组成的列表。转换为 int 时会截去坐标的小数部分。

此示例不会按轮廓对点分组,也不处理 ClosePath。要重建轮廓,需要跟踪轮廓边界并处理 ClosePath。

在文件的头部添加下一个名称空间:

1    using System.Collections.Generic;
2    using Aspose.Font.Glyphs;
3    using Aspose.Font.RenderingPath;
4    using Point = System.Drawing.Point;

运行此代码片段前,请从已加载的字体中获取一个名为 glyph 的非空 Glyph,例如使用 font.GetGlyphById(font.Encoding.UnicodeToGid('S'))。测试使用 A 和 S 的字形。字形的选择和验证不包含在代码片段中。

 1// Collect integer coordinates from a glyph path
 2
 3List<Point> points = new List<Point>();
 4IPathSegment? prevSegment = null;
 5
 6// Collect endpoints and Bezier control points without grouping contours.
 7foreach (IPathSegment segment in glyph.Path.Segments)
 8{
 9    if (segment is LineTo || segment is CurveTo)
10    {
11        if (prevSegment is MoveTo moveTo)
12        {
13            AddPoint((int)moveTo.X, (int)moveTo.Y, points);
14        }
15        if (segment is LineTo line)
16        {
17            AddPoint((int)line.X, (int)line.Y, points);
18        }
19        else if (segment is CurveTo curve)
20        {
21            AddPoint((int)curve.X1, (int)curve.Y1, points);
22            AddPoint((int)curve.X2, (int)curve.Y2, points);
23            AddPoint((int)curve.X3, (int)curve.Y3, points);
24        }
25    }
26    prevSegment = segment;
27}
28
29void AddPoint(int x, int y, List<Point> target)
30{
31    target.Add(new Point(x, y));
32}

如何计算字形的Kerning值?

另一个字形指标,但它是由字形型对象提供的。 在这里,我们谈论 kerning。像kerning这样的特征不适用于一个,而适用于一对字形。因此,要计算kerning,您需要使用不是一个标识符,而是使用两个字形的标识符。

Aspose.Font 库中的接口 IFontMetrics 定义了方法 GetKerningValue(),该方法接收字形对的字形标识符,并返回与该字形对相关的字距调整值。如果字形对不存在字距调整信息,则该方法返回 0。 所有受支持的字体格式类都实现了 IFontMetrics 接口,可通过属性 Metrics 访问。

以下代码片段使用同一个已加载的 font,获取 A 和 C 对应字形的字距调整值。在提供的 Lato 字体中,这个字形对没有调整,因此结果为 0:

1// Get kerning for the glyphs associated with A and C
2
3double kerning = font.Metrics.GetKerningValue(
4    font.Encoding.UnicodeToGid('A'), font.Encoding.UnicodeToGid('C'));

如何从字体获取字形?

字体中的任何字形都可以由特殊的glyph标识符访问。对于任何字体格式,此规则都是正确的。

字形标识符 Glyphid可以是两种类型:整数或字符串。这些 Glyphid数据类型与诸如字形索引和字形名称等字形特征相连。

同样,每个字形的索引都等于其字体中的编号。一个重要的时刻是,编号不是从1开始,而是从0开始,因此,如果字体包含15个字形,则它们具有字形IDS 0-14。

字形通常还具有字形名称,这些名称是没有空格的简短ASCII文本标签。例如,符号“+”的字形名称是“ plus”。

因此,数据类型“整数”与字形索引的字形的特征相对应,并且数据类型string符合glyph的名称。 字体的每个字形代表该字形与之相关的符号的图像,因此字形不仅将其链接到其标识符,而且与与此符号相对应的唯一代码链接。

字符代码和字形标识符之间的关系称为编码。 可以通过字形标识符或使用编码直接访问字体中的字形。

首先,在最后一个情况下,计算基于字符代码的字形标识符。然后接收到与计算标识符相对应的字形。

应该使用哪种类型的字形标识符来访问所需的字形?

这取决于字体的格式。 字形格式和紧凑型字体格式(CFF)的字体中的字形可以通过字形名称访问。实际上,这些格式字体中的字形被保存为数组,并可以通过数值索引在物理上访问,但在较高的逻辑级别上使用glyph,使用其名称。

TrueType字体使用整数类型用于字形标识符。如果TrueType字体具有“帖子”表,则可以使用字符串类型的字形名称或字形标识符来访问字形。

使用aspose.font库从字体中检索字形。

aspose.font库介绍名称空间 aspose.font.glyphs,其中放置字形,字形标识符和其他对象。 类 Glyphid是Glyph标识符的基本抽象类。 该类的对象用于获得所需的字形。

整数和字符串类型的字形标识符由类 Glyphuint32ID和 GlyphstringId的类表示。

这两个类都是从基本抽象类 Glyphid继承的,尤其是该抽象类 Glyphid的对象,在库的函数中传递,以访问所需的glyph。因此,要获得所需的字形,您可以创建一个 glyphuint32ID或 glyphstringId-type对象,然后将创建的对象传递到用于检索Glyphs的功能之一。

在大多数情况下,您不知道哪种字形标识符与特定字符相对应,因此要获得字形标识符,您需要找到字符代码和Glyph标识符之间的关系。

如上所述,字体编码负责这种关系。 基本字体编码功能由 ifOntencoding接口定义。

由所有字体类实现的基本接口 ifont定义属性 编码类型ifOntEncoding的类型,因此Aspose.font库创建的任何字体对象提供ifOntEncodingfunctionfunctionfunctionfunctionfuctioncondodingencoding*。

设计了下一个方法来计算字符代码的字形标识符: unicodetogid(), decodeTogid和 DecodetogidParameTerized:

在获得字形标识符或对Glyphid对象的引用后,您可以使用界面 iglyphaccessor定义的功能获得与此Glyphid相关联的Glyph。

接口iglyphaccessor均由任何类实现,该类别从基本font类得出,并且可以由 *ifont.glyphaccessor属性访问。

接口 iglyphaccessor定义方法 GetGlyphById()。使用此方法将通过 Glyphid传递的字形。

如何使用getglyphbyid方法获取字形的示例和相应的字形从 *glyph对象章的示例中包含在示例中。

该界面的接下来2种方法旨在获取字形标识符:

另外,接口iglyphaccessor定义属性 glyphidtype,该属性告诉我们哪种数据类型,整数或字符串极Gl​​yph标识符。

对于TrueType字体而言,支持检索字形更强大。在这里,您可以找到有关如何获取[Font Glyphs]的信息(47)。

所有使用 Aspose.Font 的示例均存储在 Aspose.Font.Examples.sln 解决方案 中,以及 Aspose.Font 文档 的 net-examples 中。

如果您有任何问题,可以在 免费支持论坛 的 Aspose.Font.Product Family 版块中提问,我们的支持团队将在几个小时内为您解决所有问题。