从字体名称获取 TrueType 字体 "post" table
Getting TrueType font "post" table from font name
我正在尝试从已安装的 TrueType 字体中提取 "post" table,我只知道它的名字。我怎样才能做到这一点?
我看过 GetFontData
函数,它似乎几乎完全符合我的要求,只是它从设备上下文当前加载的字体中获取字体数据。就我而言,虽然我没有设备上下文,但只有字体名称。
此外,我还看到类似的查询,例如 this,用于查找和检索整个字体文件,但这似乎不必要地低效和冗长,因为 Windows can 已经加载并解析了字体数据(正如我们在 GetFontData
中看到的那样)。此外,我不需要整个文件,只需要 "post" table。真的没有办法,只能自己实现吗?
您 可以 调用 GetFontData(...) 而无需 window 或 GUI,例如从命令行程序,只需动态创建一个虚拟设备上下文并在其中选择一种字体
#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;
}
我正在尝试从已安装的 TrueType 字体中提取 "post" table,我只知道它的名字。我怎样才能做到这一点?
我看过 GetFontData
函数,它似乎几乎完全符合我的要求,只是它从设备上下文当前加载的字体中获取字体数据。就我而言,虽然我没有设备上下文,但只有字体名称。
此外,我还看到类似的查询,例如 this,用于查找和检索整个字体文件,但这似乎不必要地低效和冗长,因为 Windows can 已经加载并解析了字体数据(正如我们在 GetFontData
中看到的那样)。此外,我不需要整个文件,只需要 "post" table。真的没有办法,只能自己实现吗?
您 可以 调用 GetFontData(...) 而无需 window 或 GUI,例如从命令行程序,只需动态创建一个虚拟设备上下文并在其中选择一种字体
#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;
}