2

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

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

4

1 回答 1

2

可以在没有窗口或 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;
}
于 2019-05-15T14:25:24.800 回答