1. 程式人生 > 實用技巧 >WPF 解決 Skia 因為找不到字型而繪製不出中文字元

WPF 解決 Skia 因為找不到字型而繪製不出中文字元

在 WPF 使用 Skia 做渲染工具,如果繪製的中文都是方塊,也許是字型的問題。字型的問題是 Skia 沒有找到字型,本文告訴大家如何修復

在 Skia 使用特定字型,可以使用 SkiaSharp 的 SKTypeface 方法指定

            var name = "微軟雅黑";
            var skTypeface = SKTypeface.FromFamilyName(name);

但是如何判斷 Skia 找不到字型?可以判斷字型名

            var name = "微軟雅黑";
            var skTypeface = SKTypeface.FromFamilyName(name);
            if (skTypeface.FamilyName != name)
            {
                // 字型載入失敗了
            }

解決方法是通過 WPF 輔助拿到字型,請看程式碼

            var fontFamily = new FontFamily(name);
            foreach (var familyNamesValue in fontFamily.FamilyNames.Values)
            {
                skTypeface = SKTypeface.FromFamilyName(familyNamesValue);
                if (skTypeface.FamilyName == familyNamesValue)
                {
                    break;
                }
            }

上面程式碼存在的坑是 SKTypeface 是需要手動釋放的資源,因此優化的程式碼如下

            var name = "微軟雅黑";
            var skTypeface = SKTypeface.FromFamilyName(name);
            if (skTypeface.FamilyName != name)
            {
                // 字型載入失敗了
                skTypeface.Dispose();
            }

            var fontFamily = new FontFamily(name);
            foreach (var familyNamesValue in fontFamily.FamilyNames.Values)
            {
                skTypeface = SKTypeface.FromFamilyName(familyNamesValue);
                if (skTypeface.FamilyName == familyNamesValue)
                {
                    break;
                }
                else
                {
                    skTypeface.Dispose();
                }
            }

需要在繪製之後呼叫 Dispose 釋放字型