使用字形对象| .NET的API解决方案
在编码字体时,使用字形与其单元一样至关重要。当 是什么是字体段落的 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.Glyphs;
2 using Aspose.Font.Font font;
然后,您需要采取下一步:
1 aspose.font.font font;
2
3 // Declare text and other constants
4 const string text = "Hello world";
5 const int fontSize = 10;
6
7 //Declare a variable for string width
8 double width = 0;
9
10 //Get glyphs for each letter in the text and calculate the width for the whole text
11 //The same result can be achieved using the method font.Metrics.MeasureString (text, fontSize)
12 foreach (char symbol in text)
13 {
14 GlyphId gid = font.Encoding.DecodeToGid(symbol);
15 Glyph glyph = font.GetGlyphById(gid);
16 width += (glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
17 }
要获得字形的边界框,请使用 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获取字形的所有图形原始图。
下一个 示例计算雕文所具有的所有点,并将它们存储在变量`‘‘中,该点代表具有 point类型的对象数组。
该样本使用的逻辑很简单,并且不会提取雕文轮廓。为了获得这些轮廓,使用类型 ClosePath必须添加到段处理中。
在文件的头部添加下一个名称空间:
1 using System.Collections.Generic;
2 using System.Drawing;
3 using Aspose.Font.Glyphs;
4 using Aspose.Font.RenderingPath;
然后,您需要采取下一步:
1 Glyph glyph;
2
3 //Declare resultant list with points
4 List<Point> points = new List<Point>();
5
6 //Init service reference on IPathSegment
7 IPathSegment prevSegment = null;
8
9 //Iterate all glyph path segments and collect points
10 foreach (IPathSegment segment in glyph.Path.Segments)
11 {
12 if ((segment is LineTo)
13 || (segment is CurveTo))
14 {
15 if (prevSegment is MoveTo)
16 {
17 MoveTo moveTo = prevSegment as MoveTo;
18 AddPoint((int)moveTo.X, (int)moveTo.Y, points);
19 }
20 if (segment is LineTo)
21 {
22 LineTo line = segment as LineTo;
23 AddPoint((int)line.X, (int)line.Y, points);
24 }
25 else if (segment is CurveTo)
26 {
27 CurveTo curve = segment as CurveTo;
28 AddPoint((int)curve.X1, (int)curve.Y1, points);
29 AddPoint((int)curve.X2, (int)curve.Y2, points);
30 AddPoint((int)curve.X3, (int)curve.Y3, points);
31 }
32 }
33 prevSegment = segment;
34 }
35
36 void AddPoint(int x, int y, List<Point> points)
37 {
38 Point p = new Point();
39 p.X = x;
40 p.Y = y;
41 points.Add(p);
42 }
如何计算字形的Kerning值?
另一个字形指标,但它是由字形型对象提供的。 在这里,我们谈论 kerning。像kerning这样的特征不适用于一个,而适用于一对字形。因此,要计算kerning,您需要使用不是一个标识符,而是使用两个字形的标识符。
Aspose.Font 库中的接口 IFontMetrics 定义了方法 GetKerningValue(),该方法接收字形对的字形标识符,并返回与该字形对相关的字距调整值。如果字形对不存在字距调整信息,则该方法返回 0。 所有受支持的字体格式类都实现了 IFontMetrics 接口,可通过属性 Metrics 访问。
下一个摘要计算与符号“ A”和“ C”相关的字形的Kerning值:
1 Font font;
2
3 double kerning = font.Metrics.GetKerningValue(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 版块中提问,我们的支持团队将在几个小时内为您解决所有问题。