1. 程式人生 > 實用技巧 >WPF 獲取本機所有字型拿到每個字元的寬度和高度

WPF 獲取本機所有字型拿到每個字元的寬度和高度

本文主要採用 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 就可以使用和上文相同的方法獲取文字字元寬度