SkiaSharp C# 绘图研究

SkiaSharp是 Google 的Skia 图形库的 .NET 包装器,可用于跨移动、服务器和桌面平台绘制 2D 图形。SkiaSharp 可与 OpenGL 一起用于硬件加速渲染。SkiaSharp 最初由 Mono 开发,但现在由 Microsoft 维护,并根据MIT License提供。
使用SkiaSharp实现跨平台的使用,支持windows、Linux、Anroid、IOS、WebAssembly上使用。本身源码是C++代码,经过封装支持了多种语言的开发。

SkiaCharp的基础使用

  1. 创建WinForm程序
  2. 使用nuget 安装SkiaSharp、SkiaSharp.Views.WindowsForms、SkiaSharp.Extended库,其版本号最好对应,防止依赖错误.(WPF也有类似的库)
  3. 在工具箱中添加skControl到界面上

image.png

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();
        }
    }
}
显示

image.png

将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可以解决文字的自动换行问题,该库提供了自动对中英文文字处理的功能,以下是其测试例子的结果。

image.png

关于SKBitmap 与Bitmap 等对象的相互转换问题

C# 非常好用的一个地方就是提供了很多现有的解决方案,只要你想去找,总会找到合适的解决方案。SKia的如SKBitmap、SKImage对象与System.Drawing中的转换已经提供了现有的一些库 SkiaSharp.Views.Desktop.Common库提供了相关的转换方案

image.png

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

揽月凡尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值