读取字体信息

使用 Aspose.Font API 解决方案 for C++ 探索字体度量。了解每一笔、每一道曲线以及每一个细微差别的详细信息。我们的解决方案让您轻松处理字形,提取任何字体独特特性的相关信息。

 

深入探索字体的无限可能,Aspose.Font API 解决方案为 C++ 提供了一套强大的功能,包括字体转换、字形操作、拉丁符号检测等。我们的 API 还使您能够处理字形并获取字体中包含的字形信息。提升您的设计,赋能您的项目,释放字形的全部潜能,使用 Aspose.Font for C++。不要犹豫,立即获取免费试用!

字形是字体中字符或符号的独特设计。要更好地了解这一字体单元,请阅读 Introduction to Glyph 文章。字体度量是用于描述字体外观的测量和规范。这些度量可以包括字符高度、字符宽度、字符间距以及基线位置等信息。它们帮助设计师和软件开发者准确预测数字文档和用户界面中的文本布局。

本页说明如何检索不同的字体度量,如字形数量、字母高度、字形’A’的宽度等。不过,关于字形完整功能的详细描述,请参阅《使用字形对象》文章。代码示例包括检索字体元数据的部分,其中包括字体名称。这类功能可以集成到网页应用中,例如 Aspose 生态系统中的 Font Metadata 应用。如果您想获取完整示例和数据文件,请前往 Aspose Github Project

要获取字体度量,我们需要:

  • Aspose.Font for C++ API,这是一个功能丰富、强大且易于使用的文档操作和转换 API。

  • 打开 NuGet 包管理器,搜索 Aspose.Font 并安装。您也可以在包管理控制台使用以下命令。

Package Manager Console Command


    PM> Install-Package Aspose.Font

使用 C++ 获取字体度量的步骤:

  1. 通过创建 TtfFont 类的实例来提取字体信息。
  2. 使用 FontName 属性打印字体名称。
  3. 使用 NumGlyphs 属性打印字体中的字形数量。同时打印字体度量,如 ascender、descender、typo ascender、typo descender 以及 UnitsPerEm。
  4. 代码随后从字体中检索 cmap Unicode 编码表,用于将字符码映射到字形索引。它会检查字体是否同时拥有 cmap 表和 glyf 表(后者用于访问字形)。如果两个表均存在,则检索字符 Aglyf 索引,并获取 A 符号的字形。
  5. 打印 A 字形的边界框及其宽度。

用于获取字体字形信息的 C++ 代码

    using Aspose::Font;
    using Aspose::Font::Glyphs;
    using Aspose::Font::Ttf;
    //Font file name with the full path
    
    System::SharedPtr<FontDefinition> fd = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName)));
    System::SharedPtr<TtfFont> font = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd));
    
    System::String name = font->get_FontName();
    System::Console::WriteLine(System::String(u"Font name: ") + name);
    System::Console::WriteLine(System::String(u"Glyph count: ") + font->get_NumGlyphs());
    System::String metrics = System::String::Format(u"Font metrics: ascender - {0}, descender - {1}, typo ascender = {2}, typo descender = {3}, UnitsPerEm = {4}", font->get_Metrics()->get_Ascender(), font->get_Metrics()->get_Descender(), font->get_Metrics()->get_TypoAscender(), font->get_Metrics()->get_TypoDescender(), font->get_Metrics()->get_UnitsPerEM());
    
    System::Console::WriteLine(metrics);
    
    //Get cmap unicode encoding table from the font as object TtfCMapFormatBaseTable to access the information about the font glyph for symbol 'A'.
    //Also check that font has object TtfGlyfTable (table 'glyf') to access glyph.
    System::SharedPtr<Aspose::Font::TtfCMapFormats::TtfCMapFormatBaseTable> cmapTable;
    if (font->get_TtfTables()->get_CMapTable() != nullptr)
    {
        cmapTable = font->get_TtfTables()->get_CMapTable()->FindUnicodeTable();
    }
    if (cmapTable != nullptr && font->get_TtfTables()->get_GlyfTable() != nullptr)
    {
        System::Console::WriteLine(System::String(u"Font cmap unicode table: PlatformID = ") + cmapTable->get_PlatformId() + u", PlatformSpecificID = " + cmapTable->get_PlatformSpecificId());
    
        //Code for 'A' symbol
        char16_t unicode = (char16_t)65;
    
        //Glyph index for 'A'
        uint32_t glIndex = cmapTable->GetGlyphIndex(unicode);
    
        if (glIndex != static_cast<uint32_t>(0))
        {
            //Glyph for 'A'
            System::SharedPtr<Glyph> glyph = font->GetGlyphById(glIndex);
            if (glyph != nullptr)
            {
                //Print glyph metrics
                System::Console::WriteLine(u"Glyph metrics for 'A' symbol:");
                System::String bbox = System::String::Format(System::String(u"Glyph BBox: Xmin = {0}, Xmax = {1}") + u", Ymin = {2}, Ymax = {3}", glyph->get_GlyphBBox()->get_XMin(), glyph->get_GlyphBBox()->get_XMax(), glyph->get_GlyphBBox()->get_YMin(), glyph->get_GlyphBBox()->get_YMax());
                System::Console::WriteLine(bbox);
                System::Console::WriteLine(System::String(u"Width:") + font->get_Metrics()->GetGlyphWidth(System::MakeObject<GlyphUInt32Id>(glIndex)));
            }
        }
    }