グリフとメトリクスの情報を読む

文字列幅の計算、グリフ座標の計算、およびグリフを使用したその他の操作を行う C++ API ソリューション。

 

Aspose.Font API は、変換、グリフの操作、ラテン記号の検出など、フォント関連の包括的な機能を提供します。これらの機能の一部は、書体の個々の文字またはシンボル/文字のグラフィック表現であるグリフの操作に関連しています。フォントのこれらの単位の詳細については、 Introduction to Glyph の記事を参照してください。

このページでは、グリフとメトリクス情報を読み取るためのオプションの概要を説明していますが、機能を完全に理解するには、 グリフ オブジェクトの使用 。ここでは、多数の C++ コード例を見つけて、グリフおよび Glyph オブジェクトを操作するための Aspose.Font 機能について学習します。 Aspose.Font を使用して Glyph を操作する方法を示すその他のコード例は、Aspose Github プロジェクト にあります。

ここで使用されるグリフ メトリクスという用語は、フォント内の特定のグリフの情報と測定値を指します。これらには、グリフの高さ、幅、送り幅、その他の寸法などの情報が含まれる場合があります。これらの情報は、フォント内の文字の適切な配置と間隔にとって重要です。これらのメトリックは、テキスト レイアウトおよびレンダリング システムで使用され、一貫した正確なテキスト表示を保証します。

グリフを操作するには、次のものが必要です。

  • Aspose.Font for C++ API は、機能が豊富で強力で使いやすいドキュメント操作および変換 API です。

  • NuGet パッケージ マネージャーを開き、Aspose.Font を検索してインストールします。パッケージ マネージャー コンソールから次のコマンドを使用することもできます。

Package Manager Console Command


    PM> Install-Package Aspose.Font

C++ を使用して文字列幅を計算する手順:

グリフを使用して文字列の幅を計算するには、最初に文字列内の個々のグリフの幅を決定し、次にそれらの幅を合計して合計数を取得する必要があります。手順で説明する場合、順序は次のとおりです。

  1. 文字列の幅の計算に使用するフォントとサイズを決定します。
  2. 文字列内の各文字について、フォント内の対応するグリフを決定します。文字マップを使用すると、対応するグリフのインデックスが得られます。
  3. グリフ インデックスを使用して、フォントのメトリック テーブルでグリフのメトリックを検索します。通常、グリフのメトリックには、幅、高さ、および送り幅が含まれます。
  4. 文字列内のすべてのグリフの高度な幅を合計して、文字列の合計幅を取得します。カーニング情報に注意してください。

同様のプロセスを C++ コードで記述すると、次のようになります。

文字列幅を調べるための C++ コード

    using System;
    using System::IO;
    using System::Drawing;
    using System::Collections::Generic;
    using Aspose::Font::Sources;
    using Aspose::Font::Glyphs;
    using Aspose::Font::RenderingPath;
        //Declare the text and other constants
        const System::String text = u"Hello world";
        const int32_t fontSize = 10;
    
        //Declare the variable for string width
        double width = 0;
    
        //Get glyph for each letter in text and calculate width for whole text.
        //The same result can be achieved using method font.Metrics.MeasureString(text, fontSize).
        for (char16_t symbol : text)
        {
            System::SharedPtr<GlyphId> gid = this->_font->get_Encoding()->DecodeToGid(symbol);
            System::SharedPtr<Glyph> glyph = this->_font->GetGlyphById(gid);
            width += (glyph->get_WidthVectorX() / this->_font->get_Metrics()->get_UnitsPerEM()) * fontSize;
        }
	    font->get_Metrics()->MeasureString(text, width);

        //Print the output results
        System::Console::WriteLine(System::String::Format(u"Width for text \"{0}\" with font size {2} is equal {3}.", text, FontName, fontSize, width));

C++ を使用してすべてのグリフ ポイントを座標で計算する手順:

  1. System::Drawing::Point タイプのリスト points を宣言します。このリストには、グリフ パス セグメント..
  2. IPathSegment インターフェイスで Init サービス参照を指定します。
  3. すべてのグリフ パス セグメントを繰り返し、ポイントを合計します。

グリフ ポイントを見つけるための C++ コード

    //Declare the resultant list with points
    System::SharedPtr<System::Collections::Generic::List<System::Drawing::Point>> points =
    System::MakeObject<System::Collections::Generic::List<System::Drawing::Point>>();
    
    //Init the service reference on IPathSegment
    System::SharedPtr<IPathSegment> prevSegment;
    
    //Iterate all the glyph path segments and collect points
    for (auto&& segment : glyph->get_Path()->get_Segments())
    {
        if ((System::ObjectExt::Is<LineTo>(segment)) || (System::ObjectExt::Is<CurveTo>(segment)))
        {
            if (System::ObjectExt::Is<MoveTo>(prevSegment))
            {
                System::SharedPtr<MoveTo> moveTo = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::MoveTo>(prevSegment);
                AddPoint((int32_t)moveTo->get_X(), (int32_t)moveTo->get_Y(), points);
            }
            if (System::ObjectExt::Is<LineTo>(segment))
            {
                System::SharedPtr<LineTo> line = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::LineTo>(segment);
                AddPoint((int32_t)line->get_X(), (int32_t)line->get_Y(), points);
            }
            else if (System::ObjectExt::Is<CurveTo>(segment))
            {
                System::SharedPtr<CurveTo> curve = System::DynamicCast_noexcept<Aspose::Font::RenderingPath::CurveTo>(segment);
                AddPoint((int32_t)curve->get_X1(), (int32_t)curve->get_Y1(), points);
                AddPoint((int32_t)curve->get_X2(), (int32_t)curve->get_Y2(), points);
                AddPoint((int32_t)curve->get_X3(), (int32_t)curve->get_Y3(), points);
            }
        }
        prevSegment = segment;
    }



よくある質問

1. グリフ メトリックとは

グリフ メトリック は、テキスト レイアウトの作成時にグリフがどのように配置されるかに影響するパラメーターです。

2. グリフ メトリックとは

最もよく使用されるグリフ メトリックは、幅、原点、サイド ベアリング、ベースライン、アセント、アセンダー、ディセンダー、ディセンダー、バウンディング ボックス、高さ、幅、およびカーニングです。

3. この API ソリューションでグリフを管理するには?

C# でグリフをコーディングするには、 Aspose.Font.Gly​​phs 名前空間のエンティティを使用します。

4. グリフ メトリクスの重要性は何ですか?

グリフ メトリクスを理解し、適切に調整することで、タイポグラファーやデザイナーは、印刷物、デジタル インターフェイス、または Web ページ内のテキストの最適な間隔、配置、読みやすさを確保できます。