WPF 獲取本機所有字型拿到每個字元的寬度和高度
阿新 • • 發佈:2020-09-12
本文主要採用 GlyphTypeface 類嘗試獲取每個字元的寬度和高度的值,儘管這個方法和最終 WPF 佈局使用的文字的寬度和高度是不相同的,但是依然可以作為參考
獲取系統字型資料夾的檔案
系統字型資料夾放在 @"C:\Windows\Fonts"
本文不討論使用者的系統盤放在其他盤裡面
使用 Directory.GetFiles 可以獲取所有字型檔案
var fileList = Directory.GetFiles(@"C:\Windows\Fonts", "*.ttf");
通過 *.ttf
可以限定只獲取 ttf 檔案
建立 GlyphTypeface 物件
通過 Uri 傳入檔案路徑可以建立
foreach (var font in fileList)
{
var uri = new Uri(font);
GlyphTypeface g = new GlyphTypeface(uri);
}
獲取定義的字元的寬度和高度比例
需要注意的是一個字型檔案也許會包含多個不同的 FontFamily 因此 FontFamily 建立的時候還需要傳入名字進去
foreach (var font in fileList) { var uri = new Uri(font); GlyphTypeface g = new GlyphTypeface(uri); var charList = g.AdvanceHeights.Keys; foreach (var fontName in g.FamilyNames.Values) { var fontFamily = new FontFamily(uri, fontName); var fontSize = 10; foreach (var c in charList) { var w = g.AdvanceWidths[c]; var h = g.AdvanceHeights[c]; } } }
這裡拿到的 w 和 h 就是寬度和高度比例
注意,這個值和最終文字渲染字元大小沒有很本質的關係
以下是我提供的一些測試的值,我隱藏了最終渲染字元的大小計算方法,此方法是團隊內部 文字框3.0 計算方法,此庫可以做出比 PPT 文字框差的多的效果
size {1.95666666666667,11.84} System.Windows.Size
w 0.466796875 double
h 0.9443359375 double
hw 6.0511073253833052 double
wh 0.165259009009009 double
其中 hw 和 wh 的計算方法如下
var hw = size.Height / size.Width; var wh = size.Width / size.Height;
GlyphTypeface Class (System.Windows.Media)
如果需要設定 FontWeight 等影響,可以使用先建立 Typeface 的方法,請看下面程式碼
var typeface = new Typeface(fontFamily, fontStyle, fontWeight, FontStretches.Normal);
typeface.TryGetGlyphTypeface(out GlyphTypeface glyph);
// 如果 TryGetGlyphTypeface 建立失敗,那麼就是缺少字型等,可以嘗試使用微軟雅黑等預設字型
上面程式碼獲取 glyph 就可以使用和上文相同的方法獲取文字字元寬度