C#调用skiasharp实现绘制并拖拽图形

news/2024/10/18 10:17:28/

  SkiaSharp是基于.net的跨平台二维图形库,封装的谷歌的Skia库,SkiaSharp支持在以下平台或运行时中使用,能够在图片中绘图,也提供控件在Winform、WPF等使用。本文学习skiasharpWinform的基本用法,并参照参考文献5实现绘制并拖拽圆形的简单示例。
在这里插入图片描述
  VS2022中新建Winform项目,在Nuget包管理器中搜索并安装一下SkiaSharp包,安装完毕后,会在工具箱中出现SkaiSharp相关的控件,本文使用SKControl控件绘制图形。
在这里插入图片描述在这里插入图片描述
  使用GDI+绘制图形时,最重要的类为Graphics,其包含绘制图形、填充图形、坐标变换等操作,而在skiasharp中与之对应的类为SKCanvas(SKCanvas没有专门的填充函数,而是通过SKPaint类中的Style属性设置填充还是绘制轮廓),同时skiasharp中还定义了SKPoint、SKRect、SKFont 、SKColor 、SKImage等常用类型,与GDI+中的类型对应。
在这里插入图片描述
  回到本文的绘制并拖拽圆形的简单示例,需要再SKControl控件的PaintSurface事件中绘制图形(普通控件一般都是在paint事件绘图),该事件响应函数会传入SKPaintSurfaceEventArgs参数,其中的Surface.Canvas属性用于在控件中绘图。绘制圆形的函数圆形如下,与GDI+的画圆函数差异较大,其绘图效果如下图所示:

public void DrawCircle(float cx, float cy, float radius, SKPaint paint)

在这里插入图片描述

  最后是实现拖拽效果,主要处理SKControl控件的MouseDown、MouseMove、MouseUp事件,没有什么特殊之处,仅将PaintSurface事件处理函数列在下面:

private void skBall_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e)
{e.Surface.Canvas.Clear();using var paint = new SKPaint{Color = SKColors.Blue,Style = SKPaintStyle.Fill,IsAntialias = true,StrokeWidth = 2};e.Surface.Canvas.DrawCircle(m_startP.X, m_startP.Y, 50, paint);if(m_isMoving){paint.Style = SKPaintStyle.Stroke;e.Surface.Canvas.DrawCircle(m_movingP.X, m_movingP.Y, 50, paint);}
}

在这里插入图片描述

参考文献:
[1]https://github.com/mono/SkiaSharp
[2]https://learn.microsoft.com/en-us/dotnet/api/skiasharp?view=skiasharp-2.88
[3]https://blog.csdn.net/ken0online/article/details/132363856
[4]https://www.cnblogs.com/bigben0123/p/14984984.html
[5]https://www.jb51.net/article/257125.htm


http://www.ppmy.cn/news/1446927.html

相关文章

类和对象【三】析构函数和拷贝构造函数

文章目录 析构函数析构函数的定义析构函数的作用主要作用次要作用 析构函数的特点 拷贝构造函数拷贝构造函数的定义拷贝构造函数的作用主要作用次要作用 拷贝构造函数的特点浅拷贝和深拷贝浅拷贝深拷贝 拷贝构造函数的调用场景 析构函数 析构函数的定义 析构函数(destructor) …

Systemback Ubuntu14.04 制作自定义系统ISO镜像

工作需要,要基于ubuntu自定义一些编译环境并将自己配置好的ubuntu做成镜像。 硬件准备 ​ 为保证能够顺利完成系统iso镜像的制作与系统还原,推荐准备一个较大容量的U盘或者移动固态硬盘,同时确保自己的Ubuntu系统还有比较大的可用空间。 1 S…

对话访谈——五问RAG与搜索引擎:探索知识检索的未来

记一次关于RAG和搜索引擎在知识检索方面的对话访谈,针对 RAG 与传统搜索引擎的异同,以及它们在知识检索领域的优劣势进行了深入的探讨。 Q:传统搜索引擎吗,通过召回-排序的两阶段模式,实现搜索逻辑的实现,当前RAG技术也…

IP模块——计算机网络

IP模块在计算机网络中通常指的是处理互联网协议(Internet Protocol,简称IP)的部分,它负责网络中的数据包的发送和接收。IP是一种无连接的协议,意味着它不需要建立持久的连接才能在网络中传输数据。IP模块的主要任务包括…

机器学习:深入解析SVM的核心概念【一、间隔与支持向量】

直接阅读原始论文可能有点难和复杂,所以导师直接推荐我阅读周志华的《西瓜书》!!然后仔细阅读其中的第六章:支持向量机 间隔与支持向量 **问题一:什么叫法向量?为什么是叫法向量**什么是法向量?…

5.Labview簇、变体与类(下) -- 项目与Labview类的使用

本文介绍Labview类的使用,在Labview中,何为类?应该如何理解?具体有什么应用场景? 本文基于Labview软件,讲解了类函数的使用方法和场景,从理论上讲解其数据流的底层概念,从实践上建立…

vue3、element-plus递归实现动态菜单

vue3、element-plus递归实现动态菜单 使用场景:动态菜单为什么使用递归递归在动态菜单中的实现 使用场景:动态菜单 动态菜单是指菜单项的数量和层次结构可能是动态的,通常来自后端或用户输入。这些菜单的特征包括: 多层嵌套&…

「AIGC」如何理解大语言模型

一、Transformer模型 Transformer模型是一种基于自注意力机制的架构,由Vaswani等人在2017年的论文《Attention Is All You Need》中首次提出。它主要用于处理序列到序列的任务,如机器翻译、文本摘要等。 案例:机器翻译 假设我们想将英文句子…