Aspose.FontライブラリでGlyphオブジェクトを使用します| .NET

フォントをユニットとコーディングする場合、グリフを使用することが重要です。グリフに関する基本情報が 記事 フォント段落の 記事で説明されている場合、ここでは、特にグリフとグリフオブジェクトを操作するためのAspose.Fontの機能を教えます。

グリフオブジェクト

任意のフォントのグリフは、 glyphAspose.Fontライブラリのタイプで表されます。 したがって、 glyphタイプは、フォント形式(TrueType、Compactフォント形式など)とは独立して、フォントグリフ用のユニバーサルオブジェクトです。

Glyphオブジェクトによって提供される機能

このオブジェクトはどのような機能を提供しますか?

この質問は、それが持っているプロパティによって答えられます。

この 例は、フォントサイズ 10 でテキスト “Hello world” の各グリフの送り幅を合計します。ペアカーニングは含みません。結果の単位はフォントサイズと同じで、サイズをピクセルで指定した場合はピクセル単位の幅になります。

ファイルの頭に次の名前空間を追加します。

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

スニペットを実行する前に、読み込み済みの Aspose.Font.Font オブジェクトを font という名前で用意してください。テストでは、サンプルプロジェクトの tests-data/Aspose.Font を指す DataDir から TTF/LatoWeb-Regular.ttf を読み込みます。読み込みには 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オブジェクトを使用します。

グリフの視覚的表現を取得するには、すべてのグリフのポイントの座標を知る必要があります。

GlyphオブジェクトからすべてのGlyphポイントの座標を取得する方法は?

次のプロパティ、 isemptyおよび pathは、このケースのために設計されました。

プロパティ isEmptyは補助です。グリフのパスが空であるかどうか、つまりグリフには描画指示がまったくないかどうかがわかります。値 falseがある場合、非常に便利なプロパティ パスを使用してグリフ全体の図を構築する時が来ました。

Aspose.Fontライブラリの概念では、任意のグリフの表現は、セグメントと呼ばれる最も単純なグラフィックプリミティブに分割され、インターフェイス ipathsegmentで表されます。 Interface iPathsegmentは、ベースの抽象グラフィックプリミティブです。

コンクリートグラフィックプリミティブは、 moveto、 lineto、 curveto、 closepathなどのタイプで表されます。

タイプ closepathは、現在のグラフィック輪郭の終わりを示すために使用されます。

タイプ moveto、 lineto、および curvetoの定義により、同一のポストスクリプト演算子に対応しています。

また、定義により、 ムーブトおよび linetoの型は、 movetoex()および lineto() our from windows gdi libに対応しています。

glyphプロパティパスそのグリフのすべてのグラフィックプリミティブのコレクションを提供します。 プロパティパスには SegmentPathがあり、このタイプのすべてのオブジェクトには、 pathsegmentCollectionのプロパティ セグメントがあります。このプロパティ *セグメント *は、Object * SegmentPath *が含まれるすべてのグラフィックプリミティブを返します。言い換えれば、エントリglyph.path.segmentsを使用して、Glyphのすべてのグラフィックプリミティブを取得できます。

この 例は、パスの端点と Bézier 制御点を、 ポイント 型のオブジェクトのリスト points に収集します。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のような特徴は、1つではなく、一対のグリフに適用されます。したがって、Kerningを計算するには、識別子を1つではなく2つのグリフの識別子を使用する必要があります。

インターフェイス ifontmetricsAspose.Fontライブラリのメソッド GetKerningValue()を定義します。 Glyphsペアのカーニング情報が存在しない場合、メソッドは0を返します。 ifontmetricsインターフェイスの実装は、サポートされているフォント形式のすべてのクラスに存在し、プロパティ メトリックを使用してアクセスできます。

次のスニペットは、同じ読み込み済みの 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'));

フォントからグリフを取得する方法は?

フォント内のグリフは、特別なグリフ識別子によってアクセスできます。このルールは、任意のフォント形式に当てはまります。

GlyphIdには、整数または文字列の2つのタイプがあります。これらの glyphidデータ型は、Glyph IndexやGlyph名などのGlyph特性とそれに応じてリンクしています。

また、各グリフには、フォントの番号付けに等しいインデックスがあります。重要な瞬間は、番号付けが1からではなく0から始まるため、フォントに15のグリフが含まれている場合、Glyph IDは0〜14を持っていることです。

グリフには通常、スペースのない短いASCIIテキストラベルであるグリフ名もあります。たとえば、シンボル「+」のグリフ名は「プラス」です。

したがって、データ型「整数」は、GLYPHインデックスのようなグリフの特性に対応し、データ型 stringはグリフの名前に対応します。 フォントの各グリフは、このグリフが関連付けられているシンボルの画像を表しているため、グリフはその識別子だけでなく、このシンボルに対応する一意のコードにリンクされます。

文字コードとGLYPH識別子の関係は、エンコードと呼ばれます。 フォント内のグリフは、GLYPH識別子またはエンコーディングを使用して直接アクセスできます。

最初のケースでは、文字コードに基づいたGLYPH識別子が計算されます。次に、計算された識別子に対応するグリフが受信されます。

目的のGLYPHにアクセスするために、どのタイプのGLYPH識別子を使用する必要がありますか?

フォントの形式に依存します。 タイプ1フォント形式とコンパクトフォント形式(CFF)のフォントのグリフは、グリフ名でアクセスできます。実際、これらの形式のフォントのグリフは配列として保持され、数値インデックスを介して物理的にアクセスできますが、グリフを取得するためのより高い論理レベルでは、その名前が使用されます。

TrueTypeフォントは、GLYPH識別子に整数タイプを使用します。 TrueTypeフォントに「Post」テーブルがある場合、Glyph名またはStringタイプのGlyph Identifierを使用してGlyphにアクセスできます。

Aspose.Fontライブラリを使用して、フォントからグリフを取得します。

Aspose.Font Libraryは、namespace aspose.font.glyphsを導入します。ここでは、グリフ、グリフ識別子、およびその他のオブジェクトが配置されます。 class glyphidは、GLYPH識別子のベース抽象クラスです。 そのクラスのオブジェクトは、望ましいグリフを取得するために使用されます。

整数と文字列タイプのGLYPH識別子は、クラス glyphuint32idおよび glyphstringidで表されます。

これらのクラスは両方とも、ベースの抽象クラス glyphidから継承され、特にこの抽象クラス glyphidのオブジェクトは、必要なグリフにアクセスするためにライブラリの機能に渡されます。必要なグリフを取得するには、 glyphuint32idまたは glyphstringidタイプオブジェクトを作成し、作成したオブジェクトをグリフを取得するために設計された関数の1つに渡します。

ほとんどの場合、どのGlyph識別子が特定の文字に対応するかがわからないため、Glyph Identifierを取得するには、文字コードとGlyph Identifierの関係を見つける必要があります。

上記のように、フォントエンコードはそのような関係に責任があります。 ベースフォントエンコード機能は、 ifontencodingインターフェイスによって定義されます。

すべてのフォントクラスによって実装されたベースインターフェイス ifontは、タイプifontencodingのプロパティ エンコーディングを定義しているため、Aspose.fontライブラリによって作成されたフォントオブジェクトは、プロパティエンコーディングによるifontencoding機能の実装を提供します。

次の方法は、文字コードのGLYPH識別子を計算するように設計されています。

グリフ識別子または言い換えればglyphidオブジェクトへの参照を取得した後、インターフェイス iglyphaccessorで定義された機能を使用して、このglyphidに関連付けられたグリフを取得できます。

インターフェイスiglyphacsesserは、ベースfontクラスから派生した任意のクラスによって実装され、 ifont.glyphaccesserプロパティでアクセスできます。

Interface iglyphaccesserメソッド getGlyphbyid()を定義します。この方法を使用して、 glyphidのグリフを渡します。

getGlyphByIDメソッドを使用してグリフィドと対応するグリフを取得する方法の例は、 Glyphオブジェクトで提供される機能*の章の例に含まれています。

このインターフェイスの次の2つの方法は、GLYPH識別子を取得するように設計されています。

また、インターフェイスiglyphaccesserは、プロパティ glyphidtypeを定義します。

グリフの取得のサポートは、TrueTypeフォントの方が強力です。ここでは、[フォントグリフへのアクセス]を取得する方法に関する情報を見つけることができます(47)。

Aspose.fontを使用するすべての例は、 aspose.examplesの aspose.font.examples.sln solutionに保存されます。

問題がある場合は、 aspose.font.product family 無料サポートフォーラムのセクションに投稿することができ、数時間以内にサポートチームがすべてをクリアします。