Чтение информации о глифах и их метриках
Решение на C++ API для расчёта ширины строки, координат глифов и других манипуляций с глифами.
Aspose.Font API предлагает широкий набор функций, связанных со шрифтами, включая конвертацию, манипуляцию глифами, обнаружение латинских символов и многое другое. Некоторые из этих возможностей относятся к манипуляции глифами, которые являются отдельными символами шрифта или графическими представлениями символов/знаков. Чтобы узнать больше об этих единицах шрифта, см. статью Introduction to Glyph .
Эта страница описывает вариант чтения информации о глифах и метриках, но для полного понимания функциональности обратитесь к статье Using Glyph Objects . Здесь вы найдёте многочисленные примеры кода C++ и узнаете о возможностях Aspose.Font для работы с глифами и объектами Glyph. Дополнительные примеры кода, демонстрирующие использование Aspose.Font для манипуляции глифами, можно найти в проекте Aspose Github Project .
Метрики глифов, термин используемый здесь, относятся к информации и измерениям конкретного глифа в шрифте. Они могут включать такие данные, как высота, ширина, advance width и другие размеры глифа, которые важны для правильного позиционирования и интервалов символов в шрифте. Эти метрики используются системами верстки и рендеринга текста для обеспечения согласованного и точного отображения текста.
Для работы с глифами нам требуется:
Aspose.Font for C++ API — богато функциональный, мощный и простой в использовании API для манипуляции документами и их конвертации.
Откройте менеджер пакетов NuGet, найдите Aspose.Font и установите его. Вы также можете использовать следующую команду из консоли диспетчера пакетов.
Package Manager Console Command
PM> Install-Package Aspose.Font
Шаги для расчёта ширины строки с использованием C++:
Для расчёта ширины строки с помощью глифов необходимо сначала определить ширину каждого отдельного глифа в строке, а затем суммировать эти ширины, чтобы получить общее значение. Если объяснять пошагово, порядок следующий:
- Определите шрифт и размер, которые вы хотите использовать для расчёта ширины строки.
- Для каждого символа в строке определите соответствующий глиф в шрифте. Используйте карту символов, которая даст вам индекс соответствующего глифа.
- Используя индекс глифа, найдите метрики глифа в таблице метрик шрифта. Метрики глифа обычно включают его ширину, высоту и advance width.
- Сложите advanced width всех глифов в строке, чтобы получить общую ширину строки. Обратите внимание на информацию о кернинге.
Если описывать аналогичный процесс с кодом 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++:
- Объявите список points типа System::Drawing::Point: Этот список будет хранить точки сегмента пути глифа.
- Укажите ссылку Init на интерфейс IPathSegment .
- Итерируйте все сегменты пути глифа и суммируйте точки.
Код 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. В чем важность показателей глифов?
Понимая и правильно корректируя параметры глифов, типографы и дизайнеры могут обеспечить оптимальные интервалы, выравнивание и читаемость текста в печатных материалах, цифровых интерфейсах или веб-страницах.