Читання гліфів та інформації про метрики
Рішення на C++ API для обчислення ширини рядка, координат гліфів та інших маніпуляцій з гліфами.
Aspose.Font API пропонує широкі можливості, пов’язані зі шрифтами, включаючи конвертацію, маніпуляції гліфами, виявлення латинських символів тощо. Деякі з цих функцій стосуються маніпуляції гліфами, які є окремими символами шрифту або графічними представленнями знаків/символів. Щоб дізнатися більше про ці одиниці шрифту, перегляньте статтю Introduction to Glyph .
Ця сторінка описує можливість читання інформації про гліфи та метрики, проте для повного розуміння функціональності зверніться до статті Using Glyph Objects . Тут ви знайдете безліч прикладів коду на C++ та дізнаєтеся про можливості Aspose.Font для роботи з гліфами та об’єктами Glyph. Більше прикладів коду, що демонструють використання Aspose.Font для маніпуляції гліфами, можна знайти у проекті Aspose Github Project .
Метрики гліфів, термін, що використовується тут, стосуються інформації та вимірювань конкретного гліфа в шрифті. Вони можуть включати дані, такі як висота, ширина, просування (advance width) та інші розміри гліфа, які важливі для правильного розташування та інтервалу символів у шрифті. Ці метрики використовуються системами розташування тексту та рендерингу, щоб забезпечити послідовне та точне відображення тексту.
Щоб працювати з гліфами, нам потрібно:
Aspose.Font для C++ API, який є багатофункціональним, потужним і легким у використанні API для маніпуляції та конвертації документів.
Відкрийте менеджер пакетів NuGet, знайдіть Aspose.Font і встановіть його. Ви також можете скористатися наступною командою в консолі менеджера пакетів.
Package Manager Console Command
PM> Install-Package Aspose.Font
Кроки для обчислення ширини рядка за допомогою C++:
Для обчислення ширини рядка за допомогою гліфів спочатку потрібно визначити ширину кожного окремого гліфа в рядку, а потім підсумувати ці ширини, щоб отримати загальну величину. Якщо пояснювати це кроками, порядок такий:
- Визначте шрифт і розмір, які ви хочете використати для обчислення ширини рядка.
- Для кожного символу в рядку визначте відповідний гліф у шрифті. Використайте таблицю символів (character map), яка надасть індекс відповідного гліфа.
- Використовуючи індекс гліфа, знайдіть метрики гліфа у таблиці метрик шрифту. Метрики гліфа зазвичай включають його ширину, висоту та просування.
- Складіть значення просування всіх гліфів у рядку, щоб отримати загальну ширину рядка. Зверніть увагу на інформацію про кернінг.
Якщо описувати подібний процес у 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;
}FAQ
1. Що таке метрика гліфа?
Метрики гліфа – це параметри, які впливають на розташування гліфа під час створення макета тексту.
2. Наведіть приклади метрик гліфів.
Найчастіше використовувані метрики гліфів: ширина просування, початок, бічні відступи, базова лінія, підйом, верхній підйом, спуск, нижній спуск, обмежувальний прямокутник, висота, ширина та кернінг.
3. Як керувати гліфами за допомогою цього рішення API?
Щоб кодувати гліфи в C#, використовуйте сутності простору імен Aspose.Font.Glyphs .
4. Який вплив мають метрики гліфів?
Розуміючи та правильно налаштовуючи показники гліфів, типографи та дизайнери можуть забезпечити оптимальний інтервал, вирівнювання та розбірливість тексту в друкованих матеріалах, цифрових інтерфейсах або веб-сторінках.