使用字形对象| .NET
在编码字体时,使用字形与其单元一样至关重要。当 是什么是字体段落的 Artract中解释有关字形的基本信息时,我们将在这里教您Aspose.font的功能。
字形对象
任何字体的字形以 glyph在aspose.font库中键入。 因此, glyph类型是字体字形的通用对象,独立于字体格式(trueType,compact字体格式等)。
字形对象提供的功能
这个对象为我们提供什么功能?
它的属性回答了这个问题。
- 首先,让我们看一下属性 状态。某些字体可能会损坏,并且它们的字形也可能被损坏。 财产 *状态 *告诉我们字形是否已损坏。如果它具有 parsedwitherrors的值,则该字形被错误解析,并且并非收到所有字形数据。
- 属性 widthVectorx和 左Sidebearingx告诉我们这样的 Glyph Metrics作为预先宽度和左侧轴承。
- 属性 widthVectory和 左Sidebearingy具有与widthVectorx和leftsidebearingx**的感觉,但是widthVectoryandleftsidebearingy*与垂直Y轴的坐标有关。
此 示例在字体大小为 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:
- 使用方法 *unicodetogid()*如果您的字符代码是Unicode。
- 如果您的字符代码不是Unicode使用 *decodetogid()*方法。
- 方法 *DecodeTogidParameterized()*是针对复合案例设计的,当需要特殊参数来计算字形标识符。
在获得字形标识符或对Glyphid对象的引用后,您可以使用界面 iglyphaccessor定义的功能获得与此Glyphid相关联的Glyph。
接口iglyphaccessor均由任何类实现,该类别从基本font类得出,并且可以由 *ifont.glyphaccessor属性访问。
接口 iglyphaccessor定义方法 GetGlyphById()。使用此方法将通过 Glyphid传递的字形。
如何使用getglyphbyid方法获取字形的示例和相应的字形从 *glyph对象章的示例中包含在示例中。
该界面的接下来2种方法旨在获取字形标识符:
- 如果您需要在某些文本字符串中为每个字符中的每个字符获取标识符,则可以使用方法 getGlyphsFortext()。
- 方法 getallglyphids()旨在使所有字形标识符在字体中获得。
另外,接口iglyphaccessor定义属性 glyphidtype,该属性告诉我们哪种数据类型,整数或字符串极Glyph标识符。
对于TrueType字体而言,支持检索字形更强大。在这里,您可以找到有关如何获取[Font Glyphs]的信息(47)。
所有使用 Aspose.Font 的示例均存储在 Aspose.Font.Examples.sln 解决方案 中,以及 Aspose.Font 文档 的 net-examples 中。
如果您有任何问题,可以在 免费支持论坛 的 Aspose.Font.Product Family 版块中提问,我们的支持团队将在几个小时内为您解决所有问题。