GLYPHオブジェクトの使用| .NET用のAPIソリューション
フォントをユニットとコーディングする場合、グリフを使用することが重要です。グリフに関する基本情報が 記事 フォント段落の 記事で説明されている場合、ここでは、特にグリフとグリフオブジェクトを操作するためのAspose.Fontの機能を教えます。
グリフオブジェクト
任意のフォントのグリフは、 glyphAspose.Fontライブラリのタイプで表されます。 したがって、 glyphタイプは、フォント形式(TrueType、Compactフォント形式など)とは独立して、フォントグリフ用のユニバーサルオブジェクトです。
Glyphオブジェクトによって提供される機能
このオブジェクトはどのような機能を提供しますか?
この質問は、それが持っているプロパティによって答えられます。
- まず、プロパティ stateを見てみましょう。一部のフォントは破損している可能性があり、それらのグリフも破損する可能性があります。 プロパティ *状態 *グリフが破損しているかどうかを教えてください。値 parsedwitherrorsがある場合、そのグリフにエラーが解析され、すべてのGlyphデータが受信されたわけではありません。
- プロパティ widthvectorxおよび leftsidebearingxそのような glyph metricsは、それに応じて前進幅と左側のベアリングとして教えてください。
- プロパティ widthvectoryおよび leftsidebearingyは、widthvectorxおよびleftsidebearingxと同じ感覚を持っていますが、widthvectoryとleftsidebearingyは垂直y軸の座標に関連しています。
フォントサイズが10のときにピクセルでテキスト「Hello World」の幅を計算する方法を示す次のコードスニペットを備えた 例を持ちましょう。
ファイルの頭に次の名前空間を追加します。
1using Aspose.Font.Glyphs;
2using 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オブジェクトを使用します。
グリフの視覚的表現を取得するには、すべてのグリフのポイントの座標を知る必要があります。
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のすべてのグラフィックプリミティブを取得できます。
次の exampleは、Glyphが持っているすべてのポイントを計算し、 ポイントタイプのオブジェクトの配列を表す変数「ポイント」に保存します。
このサンプルで使用されるロジックは簡単で、グリフの輪郭を抽出しません。タイプ 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のような特徴は、1つではなく、一対のグリフに適用されます。したがって、Kerningを計算するには、識別子を1つではなく2つのグリフの識別子を使用する必要があります。
インターフェイス ifontmetricsAspose.Fontライブラリのメソッド GetKerningValue()を定義します。 Glyphsペアのカーニング情報が存在しない場合、メソッドは0を返します。 ifontmetricsインターフェイスの実装は、サポートされているフォント形式のすべてのクラスに存在し、プロパティ メトリックを使用してアクセスできます。
次のスニペットは、シンボル「A」と「C」に関連付けられたグリフのカーニング値を計算します。
1 フォントフォント;
2
3 double kerning = font.Metrics.GetKerningValue(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識別子を計算するように設計されています。
- Method *Unicodetogid()*を使用します。文字コードがUnicodeの場合。
- キャラクターコードがUnicodeを使用していない場合 *decodetogid()*メソッド。
- 方法 *deCodetogidParameterized()*は、GLYPH識別子を計算するために特別なパラメーターが必要な場合に複合ケース向けに設計されています。
グリフ識別子または言い換えればglyphidオブジェクトへの参照を取得した後、インターフェイス iglyphaccessorで定義された機能を使用して、このglyphidに関連付けられたグリフを取得できます。
インターフェイスiglyphacsesserは、ベースfontクラスから派生した任意のクラスによって実装され、 ifont.glyphaccesserプロパティでアクセスできます。
Interface iglyphaccesserメソッド getGlyphbyid()を定義します。この方法を使用して、 glyphidのグリフを渡します。
getGlyphByIDメソッドを使用してグリフィドと対応するグリフを取得する方法の例は、 Glyphオブジェクトで提供される機能*の章の例に含まれています。
このインターフェイスの次の2つの方法は、GLYPH識別子を取得するように設計されています。
- いくつかのテキスト文字列のすべての文字のグリフ識別子を取得する必要がある場合は、メソッド getglyphsuttlext()を使用できます。
- 方法 getallglyphids()は、フォントで利用可能なすべてのGlyph識別子を取得するように設計されています。
また、インターフェイスiglyphaccesserは、プロパティ glyphidtypeを定義します。
グリフの取得のサポートは、TrueTypeフォントの方が強力です。ここでは、[フォントグリフへのアクセス]を取得する方法に関する情報を見つけることができます(47)。
Aspose.fontを使用するすべての例は、 aspose. examplesの aspose.font.examples.sln solutionに保存されます。
問題がある場合は、 aspose.font.product family free support forumのセクションに投稿することができ、数時間以内にサポートチームがすべてをクリアします。