如何获取文本字体文件的标题(而不是名称)?(TTF和OTF)

3

问题

在C#或VB.NET下,使用WinForms类库或WPF,并且不需要第三方应用程序或API,我想知道如何检索文本字体文件的标题,就像右键单击文本字体文件并进入详细属性页面时所显示的那样。

换句话说,我需要获取字体将在Windows注册表中注册的确切名称,这与System.Drawing.FontFamily.Name属性和System.Drawing.Font.Name属性给出的名称不同。

研究

有一些关于如何获取字体名称的StackOverflow问题,例如这个这个,但没有关于字体标题的问题。

以上内容都无法帮助我。我来举个例子来说明差异:

我有一个真正的类型字体文件,文件名为“OpenSans-Light.ttf”,在详细属性页面中显示为“Open Sans Light”,但是使用基于System.Drawing.FontFamily的解决方案会得到名称“Open Sans”。

因此,在我看来,.NET Framework(WindowsForms)类库可能没有提供获取字体标题的功能,我试图发现哪个来自Windows API的函数可以使用文件详细属性表的Windows shell扩展来获取字体标题......

......我找不到任何有关它的信息,没有信息,什么都没有,只有GetFontData函数,它并不能提供我需要的信息。


1
System.Windows.Media.Fonts 中,您有 SystemTypefaces,它会返回所有已安装的字体。类似于 System.Windows.Text.InstalledFontCollection。这可以为您提供一些信息。从 SystemTypefaces.TypeFace 对象中可以获取更多信息。请参阅 TypeFace.TryGetGlyphTypeface(out [GlyphTypeface])。(您需要首先实例化一个新的 System.Windows.Media.GlyphTypeface)。这将为您提供很多有用的信息,包括 ..\Windows\Fonts 字体文件 URI 和所有指标、许可证等。某些字体加粗权重的 花哨 名称只是铸造厂文件名。 - Jimi
1
一些其他非常具体的(数字)信息可以通过反射获得(某些类型不是公共的:MS.Internal.{}类型)。 - Jimi
1
忘了提到Fonts.GetTypefaces可以用于检索未安装的字体(私有存储库/文件夹)的信息。 - Jimi
1
因此,当尝试使用本地CultureInfo检索本地化风格名称时,返回空值,您只会得到InvariantCulture引用。您可以使用相同的过程从索引属性Win32FamilyNamesWin32FaceNames中获取信息。 - Jimi
1
没有人禁止你兼顾两者的优点 :) - Jimi
显示剩余16条评论
1个回答

3
我注意到资源管理器列表视图中的“标题”列显示了我需要的确切字体名称字符串,因此我意识到可以通过使用< strong> WindowsAPICodePack 库的win32 shell属性包装器检索字体文件的标题属性来轻松解决问题。
我知道我要求不使用第三方库的解决方案,但我几乎可以确定这并非比使用该库更理想的解决方案,因为...嗯,一致的替代方案似乎是自己实现Win32 shell属性包装器。
以下是样例代码:
Imports Microsoft.WindowsAPICodePack.Shell

Dim diInfo As New DirectoryInfo("C:\Fonts\")

For Each fiInfo As FileInfo In diInfo.GetFiles("*.ttf", SearchOption.TopDirectoryOnly)
    Dim sFile As ShellFile = ShellFile.FromFilePath(fiInfo.FullName)
    Dim title As String = sFile.Properties.System.Title.Value

    Dim sb As New StringBuilder()
    sb.AppendLine(String.Format("Name.: {0}", fiInfo.Name))
    sb.AppendLine(String.Format("Title: {0}", title))

    Console.WriteLine(sb.ToString())
Next

一个示例输出:
Name.: OpenSans LightItalic.ttf
Title: Open Sans Light Italic

Name.: OpenSans Light_0.ttf
Title: Open Sans Light

Name.: OpenSans-Bold.ttf
Title: Open Sans Bold

Name.: OpenSans-BoldItalic.ttf
Title: Open Sans Bold Italic

Name.: OpenSans-ExtraBold.ttf
Title: Open Sans Extrabold

Name.: OpenSans-ExtraBoldItalic.ttf
Title: Open Sans Extrabold Italic

Name.: OpenSans-Italic.ttf
Title: Open Sans Italic

Name.: OpenSans-Light.ttf
Title: Open Sans Light

Name.: OpenSans-LightItalic.ttf
Title: Open Sans Light Italic

Name.: OpenSans-Regular.ttf
Title: Open Sans

Name.: OpenSans-Semibold.ttf
Title: Open Sans Semibold

Name.: OpenSans-SemiboldItalic.ttf
Title: Open Sans Semibold Italic

如果我们确实需要与 Windows 注册表中显示的字符串完全相同(在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts 键中),则唯一缺少的是在字符串末尾添加“(TrueType)”或“(OpenType)”。请注意,保留 HTML 标记。

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