我正在尝试从已安装的TrueType字体中提取“ post”表,该字体仅按名称知道。我该如何实现?
我已经看到了GetFontData
函数,该函数几乎可以实现我想要的功能,只是它从设备上下文的当前加载字体中获取字体数据。就我而言,尽管我没有设备上下文,但只有字体名称。
另外,我已经看到类似的查询,例如this,用于查找和检索整个字体文件,但是由于Windows 可以已经加载并解析了字体文件,因此这似乎不必要且效率低下。字体数据(如我们在GetFontData
中看到的)。此外,我不需要整个文件,只需要“ post”表。除了自己全部实施之外,真的没有其他办法吗?
答案 0 :(得分: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;
}