Sharp dx 包含字形的最小矩形

Sharp dx smallest rectangle that encloses a glyph

我正在尝试使用 SharpDX 计算可以包围字形的最小矩形。 GetGdiCompatibleGlyphMetrics 方法似乎没有 return 正确的值,因为我的每个字符的宽度和高度似乎都为 1000+,而我指定的字体大小为 16。

fontFace = new FontFace(factory, FontFaceType.Truetype, fontFileArray, 0, FontSimulations.None);    
var glyphMetrics = fontFace.GetGdiCompatibleGlyphMetrics(16, 1, null, false, glyphIndices, false);

如果有人有想法,我将非常感谢。

可能是因为设置的字体大小 (16) 使用与屏幕分辨率不同的度量单位。

Charles Petzold 几乎是这些计算方面的专家,并且在他的 blog 和他的书中(总是推荐阅读以编写 Windows 代码)中进行了介绍。确定答案的唯一方法是根据您当前的屏幕分辨率和 DPI 设置自行计算。

我找到了解决方案。我将 post 放在这里以备将来提问。

FontFace class 有一个名为 FontFace1 的子 class,它本身有一个方法 GetKerningPairAdjustments。这个紧缩参数解决了一切。

GetGdiCompatibleGlyphMetrics returns 设计单位的指标,你必须自己缩放它们,使用你的字体大小,像素每次倾角比(在你的情况下为 1),并设计 Em 框大小你的字体已。这将为您提供按比例缩放的设计指标。 GetKerningPairAdjustments 与此无关,只有当字体具有字距对数据并且您确实在布局中启用了字距调整时才能使用它。请注意,它不同于您的布局可能从整形中获得的默认字距调整,您不能假设它是相同的,因为 GPOS 数据不必匹配对字距调整数据。无论如何,如果你想得到真正的墨盒,你必须渲染一个字形,没有其他方法可以得到准确的结果。