当前位置: 首页 > 知识库问答 >
问题:

在C#中查找字形宽度(专用字体)

艾灿
2023-03-14

是否有一种方法可以从C#访问私有(即未安装)字体的字形宽度而不求助于以下内容:如何通过解析TTF字体文件获得字形宽度?

共有1个答案

卢鸿博
2023-03-14

System.Windows.Media(PresentationCore.dll)中的GlyphTypeface类提供了对以EM为单位的高级宽度的访问。PDF字体描述符要求宽度为以千分之一em为单位的整数。

using System;
using System.Windows.Media; // requires PresentationCore.dll

namespace ConsoleAppFontMetrics
{
    internal class Metrics
    {
        internal static void PrintWidths(string path)
        {
            var ffs = Fonts.GetFontFamilies(path);
            foreach (var ff in ffs)
            {
                foreach (var t in ff.GetTypefaces())
                {
                    Console.WriteLine(t.Style);
                    if (t.TryGetGlyphTypeface(out GlyphTypeface gt))
                    {
                        foreach (var ctg in gt.CharacterToGlyphMap)
                        {
                            var width = (int)Math.Round(gt.AdvanceWidths[ctg.Value] * 1000);

                            Console.WriteLine($"{(char)ctg.Key} ({ctg.Key}) Width = {width}");
                        }
                    }
                }
            }
        }
    }
}

为我的TrueType字体运行上面的代码会得到以下结果:

Normal
a (97) Width = 1160
b (98) Width = 1663
c (99) Width = 2065

输出与先前导出的PDF(来自另一个程序)中的元数据相匹配,并嵌入了字体。

8 0 obj
<<
/Type/Font
/Subtype/TrueType
/Name/F2
/BaseFont/XXXXXX
/FontDescriptor 7 0 R
/FirstChar 97
/LastChar 99
/Widths[1160 1663 2065]
>>
endobj
 类似资料:
  • CIDfont宽度是在什么单位/空间中定义的?我试图为文档中的glyph获取设备空间坐标(或者,在我的例子中,相当于默认用户空间),但我在复合字体的glyph置换方面遇到了问题。 国际标准化组织规范(CIDFonts上的8.7.1)说DW是以用户单位定义的。这似乎是一个奇怪的选择,因为其他字体类型(除了Type3)的宽度都是以字形空间定义的,但是W中的宽度也是以用户单位定义的是有意义的。 但情况似

  • 问题内容: 当使用 固定宽度的字体时 ,我想用 字符 指定HTML元素的宽度。 “ em”单位应该是M字符的宽度,因此我应该能够使用它来指定宽度。这是一个例子: 结果不是我想要的结果,因为浏览器行在第15列之后而不是10处中断: (结果是Firefox和Chromium,都在Ubuntu中。) 问题答案: 1em是M的高度,而不是宽度。同样适用于ex,即x的高度。一般来说,这些是大写和小写字母的高

  • C 11首先引入了对通过用户定义的文本在C中定义新文本的支持。C 11或更高版本是否也为

  • ; StrStr ; 输入,堆栈顶 = 要查找的字串 ; 堆栈顶-1 = 在该字串中查找 ; 输出,堆栈顶 (替换为字串剩余部分) ; 不改变其它变量值。 ; ; 用法: ; Push "this is a long ass string" ; Push "ass" ; Call StrStr ; Pop $R0 ; ($

  • http://blog.mikemccandless.com/2012/03/new-index-statistics-in-lucene-40.html 该链接(向下一步,发现提到了长度)谈到了在索引时访问值。我希望能够在索引后这样做。该链接还谈到了将值保存为doc值,但没有给出如何这样做的示例。 如果有人能提供保存文档长度或在索引后访问文档的示例,这将非常有帮助。谢了。

  • 工作解决方案: 破“解”: 我们将单词字符定义为以下任一项: null null 第一行包含一个整数n,表示句子的数目。后面的每一行都包含一个由非单词字符分隔的单词组成的句子。下一行包含一个整数,表示查询的数量。后续行中的每一行都包含一个要检查的字符串。 制约因素 1≤n≤100 1≤q≤10 作为现有的子字出现时间。 作为悲观主义者的子词出现时间。 作为Optimist的子词出现时间。 whil