【问题标题】:Extracting Font Version via WinAPI通过 WinAPI 提取字体版本
【发布时间】:2015-08-12 16:04:50
【问题描述】:

Windows 控制面板字体窗口通常会显示字体的版本信息。例如

 Font Name: Fontawesome
 Version: Version 4.3.0 2015

我已经在 Windows API 和 SO 中进行了搜索,但我还没有设法找到如何以编程方式提取它。

有什么想法吗?

【问题讨论】:

  • 当您说 “通常” 时,您必须为操作系统命名。 Windows 7、8、8.1 和 10 不显示版本信息。
  • @IInspectable - 您可以在字体预览窗口中看到版本。

标签: c++ winapi fonts


【解决方案1】:

请注意,如果您谈论的是字体预览程序;那不是“Windows”,它实际上只是一个与操作系统捆绑在一起的小型实用程序。为了向您显示该信息,它会参考字体的 name 表中的信息(spec here, for understanding its structure,每个 record id 的语义在“名称 ID”部分中进行了解释)。

要自己访问这些数据,请使用 DirectWrite(不是 GDI,因为它是古老且过时的)IDWriteFontFace::TryGetFontTable 方法,并获取对每个有效 OpenType 字体都包含的 name 表的引用。然后根据命名表的规范提取您需要的值。

并且要明确:两者 ttfotf 字体都是 OpenType 字体,第一个只是“OpenType with outlines using the TrueType table layout”,第二个是“OpenType with使用 CFF 数据块编码的轮廓”。如果您不知道这两者之间的区别是什么,那是因为区别并不重要:就好像我们决定根据它们是否使用隔行扫描来调用 PNG 文件 nilili 文件。

ttf 文件扩展名只是早于 OpenType 规范本身,所以当每个人都切换到 OpenType 字体时,为了向后兼容而保留扩展名。几十年后,事实证明继续这样做更容易而不是决定“何时摆脱它”,所以我们被两个扩展名都用于同一种文件。历史!)

【讨论】:

  • 感谢您的出色回答。不幸的是,虽然我已经建立了一些初步的东西,但我还没有设法理解我应该如何使用“openTypeTableTag”参数,而且这个 API 的示例/文档似乎很少!
  • 您正在尝试提取“名称”表,使用(根据文档链接)以下宏来形成表的标记参数:DWRITE_MAKE_OPENTYPE_TAG('n','a','m','e')
  • 谢谢迈克!最后我确实设法到达那里,数据甚至似乎是正确的:) 我发现我在谷歌上找到的“葡萄酒”代码 sn-ps 指向了正确的方向。
猜你喜欢
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2014-06-25
  • 2014-11-24
  • 2020-02-15
相关资源
最近更新 更多