【问题标题】:Getting TrueType font "post" table from font name从字体名称获取 TrueType 字体“post”表
【发布时间】:2019-10-02 16:06:36
【问题描述】:

我正在尝试从已安装的 TrueType 字体中提取“post”表,我只知道它的名称。我怎样才能做到这一点?

我见过GetFontData 函数,它似乎几乎完全符合我的要求,只是它从设备上下文当前加载的字体中获取字体数据。就我而言,虽然我没有设备上下文,但只有字体名称。
此外,我还看到过类似的查询,例如 this,用于查找和检索整个字体文件,但这似乎不必要地低效且冗长,因为 Windows 可以 已经加载和解析字体数据(正如我们看到的GetFontData)。此外,我不需要整个文件,只需要“发布”表。真的没有办法,只能自己实现吗?

【问题讨论】:

  • 我不确定您要的是什么。如果 GetFontData(...) 为您提供所需的内容,则将字体选择到 HDC 中并调用它。
  • @jwezorek 但是拥有 HDC 意味着设置和/或绑定到某种渲染上下文,不是吗?我没有也不需要。我没有做那种事,我什至没有窗户。
  • “post”表到底是什么意思?
  • 是TrueType字体文件格式的“表格”之一,由字符串“post”标识

标签: c++ windows winapi truetype


【解决方案1】:

您可以在没有窗口或 GUI 的情况下调用 GetFontData(...),例如从命令行程序中,只需动态创建一个虚拟设备上下文并在其中选择一种字体

#include <Windows.h>
#include <vector>

std::vector<unsigned char> GetFontDataByName(const wchar_t* font_name)
{
    HDC hdc = CreateCompatibleDC(NULL);

    auto font = CreateFont(0, 0, 0, 0,
        FW_NORMAL, FALSE, FALSE, FALSE,
        ANSI_CHARSET, OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
        DEFAULT_PITCH,
        font_name);
    SelectObject(hdc, font);
    auto num_bytes = GetFontData(hdc, 0, 0, NULL, 0);
    std::vector<unsigned char> font_data(num_bytes);
    auto result = GetFontData(hdc, 0, 0, &(font_data[0]), num_bytes);

    DeleteDC(hdc);

    return font_data;
}

int main()
{
    auto font_data = GetFontDataByName(L"Times New Roman");

    return 0;
}

【讨论】:

  • 来自CreateFont: "因为可用字体可能因系统而异,所以不要假设所选字体总是与请求的字体相同。例如,如果您请求一个字体名为 Palatino,但系统上没有此类字体可用,字体映射器将替换具有相似属性但名称不同的字体。"
  • OP 声明该字体已安装并且他只有它的名称。鉴于它已安装 CreateFont 保证创建它的某个版本,但是我猜可能有多个版本。您必须通过在您提供给 CreateFont 的字体名称之外的其他参数中更加小心来区分那里,因为它们会影响匹配逻辑
猜你喜欢
  • 2012-03-22
  • 2011-01-14
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2019-12-10
  • 2015-05-01
  • 1970-01-01
相关资源
最近更新 更多