如何从字体文件中获取字体族名称?

4
我有一组具有不可预测文件名的字体文件,因此无法从文件名中推断出真正的“字体系列”名称。为了呈现此字体文件,我需要读取字体元数据以提取真正的“字体系列”名称。我使用的是C#.NET 4.0 WinForms。
我看到了函数“GetFontInformation”,但我似乎找不到同样的P/Invoke标头。所有我拥有的只有C ++版本,这实在很难理解。有任何想法吗?
我无法使用“PrivateFontCollection”类代替我解析字体文件,因为这些是OTF字体,而.NET/GDI+仅支持TTF字体!

如果您有一个 Font 对象,您可以访问 FontFamily 属性:http://msdn.microsoft.com/en-us/library/system.drawing.font.aspx 这个方法不起作用吗? - Yuck
您也可以尝试使用基于文件的Uri加载字体文件:http://msdn.microsoft.com/en-us/library/ms602324.aspx - Yuck
2个回答

5

您需要将字体添加到 (PrivateFontCollection),然后请求 FontFamily 并获取其 Name 属性。

private static string GetFontNameFromFile(string filename)
{
    PrivateFontCollection fontCollection = new PrivateFontCollection();
    fontCollection.AddFontFile("path_to_font");
    return fontCollection.Families[0].Name;
}

所需命名空间:

using System.Drawing;
using System.Drawing.Text;

4
这种方法适用于 TTF 字体,但不适用于 OTF 字体。 - Robin Rodricks
2
@Geotarget 这不是真的。它也适用于 OTF 字体。 - SepehrM
1
如果你尝试它,它是不起作用的。这是不可能的,因为.NET不支持OTF,因为GDI+只支持TTF或其他格式。http://www.codeproject.com/Tips/557423/Rendering-Text-with-OpenType-Fonts-Using-GDI http://stackoverflow.com/questions/6766670/textrenderer-drawtext-using-gdi-to-render-otf-fonts .. 搜索谷歌:https://www.google.co.in/webhp?sourceid=chrome-instant&rlz=1C1CHMO_en-GBIN580IN580&ion=1&espv=2&ie=UTF-8#q=.net+gdi+otf+support&spell=1 - Robin Rodricks
2
我在字体方面有丰富的经验,可以确认.NET不支持OTF字体(或者说,OpenType格式的字体,有时OTF字体实际上包含TTF数据,这是可以工作的)。 - Robin Rodricks
可以正常使用“FontAwesome.otf”,它似乎是一种OpenType字体。具体来说,Windows字体预览显示它包含“PostScript Outlines”。其他字体有不同的组合,例如“GLYPHICONS Halflings”包含“OpenType Layout,TrueType Outlines”。 - Triynko

2
只需打开(双击)其中一个字体文件,您就会看到类似于这样的内容:-

enter image description here


我不认为这是正确的。例如,如果我在Windows中打开“JetBrains Mono Nerd Font”,它会显示名称为“JetBrainsMono NFM”。现在,如果我在VSCode中使用“JetBrainsMono NFM”,它不起作用。如果我使用“JetBrains Mono Nerd Font”,它就可以正常工作。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接