【问题标题】:How to Get Font Properties from a Font File Name?如何从字体文件名中获取字体属性?
【发布时间】:2010-02-25 03:22:24
【问题描述】:

我正在尝试使用 Linq 遍历 %windir%\Fonts 文件夹中的所有字体,并找到属性标题为“Arial”(或提供的任何字体系列名称)的字体,但我不能似乎可以访问字体属性(例如“标题”、“字体样式”、“设计用于”等)。

以下只是给我基本的文件信息:

     Dim fontDir = Environment.GetEnvironmentVariable("windir") & "\Fonts\"
     Dim fontFiles = From file In My.Computer.FileSystem.GetFiles(fontDir)
     Dim fontInfo = From fontFile In fontFiles Select _
               My.Computer.FileSystem.GetFileInfo(fontFile)

我想在结尾加上...Where fontFile.Title = "Arial" 之类的东西。这里有什么建议吗?

我需要这样做的原因是找到具有一个或多个属性(如 Title)的字体,然后将该字体文件物理复制到另一个目录。

【问题讨论】:

    标签: vb.net linq fonts linq-to-objects


    【解决方案1】:

    您可以使用 framwework System.Drawing.Text.InstalledFontCollection 类并询问已安装的字体,而不是这样做。获取列表并使用 linq 执行。

    或者,按照上面的方式进行操作,您必须将字体加载到System.Drawing.Text.PrivateFontCollection,然后像上面一样应用查询来查找字体。

    已编辑添加此内容,以便其他人可以轻松发现它: 为了找到文件关联,我必须通过枚举这些注册表项中的一个或两个来查找字体名称及其对应的字体文件。字体文件夹始终位于“%Windows%\Fonts”

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
    

    【讨论】:

    • 一旦找到我需要的文件,我确实需要访问物理文件。例如,在这种情况下,我需要找到以 Arial 为标题的字体文件,然后将字体文件复制到不同的目录。如果InstalledFontCollection 具有Path 的属性,那么我肯定会使用它。
    • 我记得我在 C++ 中做过一些事情。挖出一些旧代码并找到方法:) 实际上,您必须枚举注册表项才能找到字体的所有名称,并且数据是字体文件。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts 编写一些代码,将遍历此键中的所有条目。字体的路径始终是 %windows%\Fonts 文件夹。如果您不在受控环境中,请尝试阅读此键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
    • 这真是太好了。我一直在看这把钥匙,看起来它大部分都有我需要的东西。您如何处理与“Name (TrueType)”模式不匹配的内容的解析?我只找到了一些奇怪的球,例如 Batang & BatangChe & Gungsuh & GungsuhChe (TrueType) *、*Roman (All res)Small Fonts (120)Segoe CondensedCourier 10,12,15。不是太多,但我只是想知道它是否在某处记录了字体名称如何位于此键中,以便我可以对它们应用一些 RegEx。
    【解决方案2】:

    您可能应该使用System.Drawing.Text.InstalledFontCollection 类而不是直接探测文件系统。然后你可以这样做:

    var arialFontFamilies = from fontFamily in new InstalledFontCollection().Families
                            where fontFamily.Name.Contains("Arial");
    

    如果您想访问更多属性,可以创建 Font 对象:

    var arialFonts = from fontFamily in new InstalledFontCollection().Families
                     where fontFamily.Name.Contains("Arial")
                     select new Font(fontFamily, FontSize.Regular);
    

    如果您仍需要从磁盘上的任何位置访问一组自定义字体,您可以使用 PrivateFontCollection 类:

    var fontFiles = from fileInfo in (from file in My.Computer.FileSystem.GetFiles(fontDir) select Computer.FileSystem.GetFileInfo(file));
    
    var privateFonts = new PrivateFontCollection();
    foreach (var fontFile in fontFiles)
    {
        privateFonts.AddFontFile(fontFile.FullName);
    }
    
    var arialFonts = from fontFamily in new privateFonts.Families
                     where fontFamily.Name.Contains("Arial")
                     select new Font(fontFamily, FontSize.Regular);
    

    【讨论】:

    • 有趣,我没想到。让我看看。
    • 不幸的是,它不起作用。它仍然没有给我标题、字体样式等的字体属性。
    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2013-11-15
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多