2012-08-15 23 views
2

我需要为任意字体中的每个字符查找确切的大小。如何找到WPF中任意字形的确切大小?

该字体使用GlyphTypeface类加载。

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

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

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

回答

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 - 找到真正的大小需要乘以字体大小。

+0

你知道是否有一种方法可以使用C中的vanilla Win32 GDI调用来获得这个确切的字形高度? – 0xbe5077ed 2013-05-24 21:07:01

2

也许你可以得到由GlyphTypeface.GetGlyphOutline方法返回的几何形状的Bounds

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; 
+0

不幸的是,这种方法不会产生正确的值 - 它可以给出一个字形的平方尺寸,它根本不是方形的(宽度/高度太不同)。也许这是我用的字体有问题? – 2012-08-15 15:53:06

相关问题