2012-08-15 65 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