字形とメトリック情報を読む
C++ API ソリューションで文字列幅を計算し、字形座標を求め、その他の字形操作を行います。
Aspose.Font API は、変換、字形の操作、ラテン文字の検出など、フォントに関する包括的な機能を提供します。これらの機能のいくつかは、字形(フォントの個々の文字やシンボル/文字のグラフィック表現)に関する操作に関係しています。フォントのこのユニットについて詳しく知るには、 Glyphの概要 記事をご参照ください。
このページでは字形とメトリック情報の取得オプションを概説していますが、機能全体を理解するには、 Glyphオブジェクトの使用 記事をご参照ください。ここでは多数の C++ コード例が掲載されており、Aspose.Font が字形や Glyph オブジェクトを操作する機能を学べます。字形操作のさらなるコード例は、Aspose の Github プロジェクト で見つけられます。
ここで使用される字形メトリックとは、フォント内の特定の字形に関する情報や測定値を指します。これには字形の高さ、幅、前進幅などの寸法が含まれ、文字の適切な配置や間隔に重要です。これらのメトリックはテキストレイアウトやレンダリングシステムで使用され、一貫した正確なテキスト表示を保証します。
字形を操作するには以下が必要です:
豊富な機能を備えた、使いやすくパワフルな文書操作・変換 API である Aspose.Font for C++ API。
NuGet パッケージマネージャーを開き、Aspose.Font を検索してインストールします。または、パッケージマネージャーコンソールで以下のコマンドを使用できます。
Package Manager Console Command
PM> Install-Package Aspose.Font
C++ を使用した文字列幅の計算手順:
文字列の幅を字形で計算するには、まず文字列内の各字形の幅を決定し、それらの幅を合計して総幅を求めます。手順を説明すると順序は次の通りです:
- 文字列幅を計算するために使用するフォントとサイズを決定します。
- 文字列内の各文字について、フォント内の対応する字形を決定します。文字マップを使用すると、対応する字形のインデックスが得られます。
- 字形インデックスを使用して、フォントのメトリックテーブルから字形のメトリックを参照します。字形のメトリックには通常、幅、高さ、前進幅が含まれます。
- 文字列内のすべての字形の前進幅を合計して、文字列の総幅を得ます。カーニング情報にも注意してください。
同様のプロセスを 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++ を使用したすべての字形点と座標の計算手順:
- System::Drawing::Point 型のリスト points を宣言します。このリストは字形パスセグメントの点を格納します。
- IPathSegment インターフェイス上で Init サービス参照を指定します。
- すべての字形パスセグメントを反復処理し、点を合計します。
字形点を求める 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.Glyphs 名前空間のエンティティを使用します。
4. グリフ メトリクスの重要性は何ですか?
グリフ メトリクスを理解し、適切に調整することで、タイポグラファーやデザイナーは、印刷物、デジタル インターフェイス、または Web ページ内のテキストの最適な間隔、配置、読みやすさを確保できます。