2

我需要找到任意字体中每个字符的确切大小。

字体是使用GlyphTypeface类加载的。

问题是我只能使用 AdvanceWidths 属性直接访问字形的宽度,但每个字符的高度都是相同的,并且它被设置为Height属性。

似乎可以使用 Baseline、Height、XHeight、BottomSideBearings 和 TopSideBearings 属性的组合来计算单个字符的高度,但是没有关于所有这些值的真正含义的文档。整个字体的基线、高度和 XHeight 值是恒定的,关于其他两个 - BottomSideBearings 和 TopSideBearings - 我找不到它们的含义。

一般来说,是否有任何信息可以从任意字体计算单个字形的大小?(只有“TTF”文件,或者可以从中加载任何其他 GlyphTypeface)。

4

2 回答 2

3

经过一番研究,找到了计算字符大小的正确方法:

var typeface = new GlyphTypeface(new Uri(fontpath));
var character = 'W';
var charIndex = typeface.CharacterToGlyphMap[character];

var width = typeface.AdvanceWidths[charIndex];
var height = typeface.Height - typeface.TopSideBearings[charIndex]
                             - typeface.BottomSideBearings[charIndex];

这将给出 em 中的字符大小 - 要找到实际大小,它需要乘以字体大小。

于 2012-08-25T12:31:12.777 回答
2

您也许可以获得GlyphTypeface.GetGlyphOutline方法返回的几何边界:

GlyphTypeface typeface = new GlyphTypeface(new Uri(@"C:\Windows\Fonts\SegoeUI.ttf"));
ushort glyphIndex = typeface.CharacterToGlyphMap['W'];
double emSize = 14d;
Geometry outline = typeface.GetGlyphOutline(glyphIndex, emSize, 0d);
Size size = outline.Bounds.Size;
于 2012-08-15T15:15:27.127 回答