SkiaSharp是 Google 的Skia 图形库的 .NET 包装器,可用于跨移动、服务器和桌面平台绘制 2D 图形。SkiaSharp 可与 OpenGL 一起用于硬件加速渲染。SkiaSharp 最初由 Mono 开发,但现在由 Microsoft 维护,并根据MIT License提供。
使用SkiaSharp实现跨平台的使用,支持windows、Linux、Anroid、IOS、WebAssembly上使用。本身源码是C++代码,经过封装支持了多种语言的开发。
SkiaCharp的基础使用
- 创建WinForm程序
- 使用nuget 安装SkiaSharp、SkiaSharp.Views.WindowsForms、SkiaSharp.Extended库,其版本号最好对应,防止依赖错误.(WPF也有类似的库)
- 在工具箱中添加skControl到界面上
using SkiaSharp;
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void skControl1_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e)
{
var canvas= e.Surface.Canvas;
SKPaint paint = new SKPaint
{
Style = SKPaintStyle.Stroke,
Color = SKColors.Red,
StrokeWidth=2,
//设置抗锯齿
IsAntialias = true,
};
//设置虚实线;
float[] dash_param = {
5F, 3F };
SKPathEffect dashes = SKPathEffect.CreateDash(dash_param, 0);
paint.PathEffect = dashes;
SKPaint fill_paint = new SKPaint
{
Style = SKPaintStyle.Fill,
Color = new SKColor(255,0,0,125),
StrokeWidth = 10
};
canvas.Clear(new SKColor(100, 100, 100, 125));
canvas.DrawLine(0, 0, 200, 200, paint);
canvas.DrawRect(0, 0, 500, 500, fill_paint);
SKPaint text_paint = new SKPaint
{
FakeBoldText = true,
TextSize = 50,
Color = SKColors.Green,
TextAlign = SKTextAlign.Center,
//宋体,不然不支持中文绘制;
Typeface = SKTypeface.FromFamilyName("SimSun")
};
canvas.Save();
//逆时针旋转45度绘制
canvas.RotateDegrees(-45, 250, 250);
canvas.DrawText("我是中国人", new SKPoint(250, 250), text_paint);
canvas.Restore();
}
}
}
显示
将Canvas内容绘制到图片、PDF、SVG等设备
//创建基于PDF、SVG、PNG的绘图文件.
public SKCanvas createFile(string file_name, int width, int height, StoreType store_type)
{
var wStream = new SKFileWStream(file_name);
if (store_type == StoreType.StoreSvg)
{
return SKSvgCanvas.Create(SKRect.Create(width, height), wStream);
}
else if (store_type == StoreType.StorePDF)
{
var _pdf_doc = SKDocument.CreatePdf(wStream);
_pdf_doc.BeginPage(width, height);
return pdf_doc;
}
else if (store_type == StoreType.StorePng)
{
return SKSurface.CreateNull(width, height);
}
return NULL;
}
//将内容绘制到图片上,创建基于图片的canvas即可;
public SKCanvas GetCanvas(SKBitmap bitmap)
{
return new SKCanvas(bitmap);
}
//将数据绘制到内存上,并直接进行到各自的类型文件中
public SKCanvas createStream(MemoryStream memStream, int width, int height, XDICanvas.StoreType store_type)
{
SKManagedWStream wstream = new SKManagedWStream(memStream);
if (store_type == StoreType.StoreSvg)
{
return SKSvgCanvas.Create(SKRect.Create(width, height), wstream);
}
else if (store_type == StoreType.StorePDF)
{
var _pdf_doc = SKDocument.CreatePdf(wstream);
var file_canvas = _pdf_doc.BeginPage(width, height);
return file_canvas;
}
return true;
}
通过Skia读取Svg图
默认情况下SkiaSharp并不提供SVG的读取功能,在其C++底层中也属于扩展功能,在C#中使用
Svg.Skia
库来处理Svg图片。
public void DrawSvg(SKCanvas canvas,string svg_data) //svg的字符串
{
SvgDocument svgDocument;
#if NETFOR60
svgDocument=SvgExtensions.FromSvg(svg_data);
#else
//低版本的使用方式;
svgDocument = SvgDocument.FromSvg<SvgDocument>(svg_data);
#endif
var rect = new XDRect(0, 0, svgDocument.Width.Value, svgDocument.Height.Value);
SKSvg svg = new SKSvg();
var picture = svg.FromSvgDocument(svgDocument);
canvas.DrawPicture(picture):
}
如何通过Skia解决绘制文字自动换行问题
Skia库默认并没有直接提供对文字的自动换行解决方案,如果自己编写难度还是比较大的。发现已经有一个开源库
SkiaTextRenderer
可以解决文字的自动换行问题,该库提供了自动对中英文文字处理的功能,以下是其测试例子的结果。
关于SKBitmap 与Bitmap 等对象的相互转换问题
C# 非常好用的一个地方就是提供了很多现有的解决方案,只要你想去找,总会找到合适的解决方案。SKia的如SKBitmap、SKImage对象与System.Drawing中的转换已经提供了现有的一些库
SkiaSharp.Views.Desktop.Common
库提供了相关的转换方案