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获取中文字体

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

图片中的中文为口子方块:

图片中的中文为口子方块
图片中的中文为口子方块

解决方法

使用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

图片中的中文正确显示:

图片中的中文正确显示
图片中的中文正确显示

也可以直接使用SKTypeface.FromFamilyName("SimSun")获取中文字体

posted @ 2020-12-18 17:37  $("#阿飞")  阅读(2125)  评论(0编辑  收藏  举报