SkiaSharp中文字体问题.md
SkiaSharp 中文字体问题
SkiaSharp
SkiaSharp是基于Google的Skia图形库(skia.org)的.NET平台的跨平台2D图形API 。它提供了全面的2D API,可在移动,服务器和台式机模型之间使用以渲染图像。
SkiaSharp为以下内容提供跨平台绑定:
- .NET标准1.3
- .NET核心
- 提岑
- Xamarin.Android
- Xamarin.iOS
- Xamarin.tvOS
- Xamarin.watchOS
- Xamarin.Mac
- Windows经典桌面(Windows.Forms / WPF)
- Windows UWP(台式机/移动/ Xbox / HoloLens)
- Web汇编(WASM)
该API文档可在以下网站上浏览。
SKTypeface.FromFamilyName
获取中文字体
- 操作系统WIN8
- 目标框架.Net Framework4.7.2
var stypeface = SKTypeface.FromFamilyName("宋体");
通过该方法无法正确获取宋体。获取到的为SkiaSharp默认的字体:
{SkiaSharp.SKTypeface.SKTypefaceStatic}
FamilyName: "Segoe UI"
FontSlant: Upright
FontStyle: {SkiaSharp.SKFontStyle}
FontWeight: 400
FontWidth: 5
GlyphCount: 5012
Handle: 0x05112170
IgnorePublicDispose: true
IsBold: false
IsDisposed: false
IsFixedPitch: false
IsItalic: false
OwnsHandle: true
Style: Normal
TableCount: 23
UnitsPerEm: 2048
图片中的中文为口子方块:
![图片中的中文为口子方块 图片中的中文为口子方块](Images/%E5%9B%BE%E7%89%87%E4%B8%AD%E7%9A%84%E4%B8%AD%E6%96%87%E4%B8%BA%E5%8F%A3%E5%AD%90%E6%96%B9%E5%9D%97.png)
图片中的中文为口子方块
解决方法
使用SKFontManager
类来获取中文字体,代码如下:
// 获取宋体在字体集合中的下标
var index = SKFontManager.Default.FontFamilies.ToList().IndexOf("宋体");
// 创建宋体字形
var songtiTypeface = SKFontManager.Default.GetFontStyles(index).CreateTypeface(0);
获取到正确的中文字体:
{SkiaSharp.SKTypeface}
FamilyName: "SimSun"
FontSlant: Upright
FontStyle: {SkiaSharp.SKFontStyle}
FontWeight: 400
FontWidth: 5
GlyphCount: 28762
Handle: 0x060aace0
IgnorePublicDispose: true
IsBold: false
IsDisposed: false
IsFixedPitch: false
IsItalic: false
OwnsHandle: true
Style: Normal
TableCount: 22
UnitsPerEm: 256
图片中的中文正确显示:
![图片中的中文正确显示 图片中的中文正确显示](Images/%E5%9B%BE%E7%89%87%E4%B8%AD%E7%9A%84%E4%B8%AD%E6%96%87%E6%AD%A3%E7%A1%AE%E6%98%BE%E7%A4%BA.png)
图片中的中文正确显示
也可以直接使用SKTypeface.FromFamilyName("SimSun")
获取中文字体