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

  SkiaSharp是基于.net的跨平台二维图形库,封装的谷歌的Skia库,SkiaSharp支持在以下平台或运行时中使用,能够在图片中绘图,也提供控件在Winform、WPF等使用。本文学习skiasharp在Winform的基本用法,并参照参考文献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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/579338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

Root Motion动画与普通动画的区别 普通动画:动画文件里记录的是物体的绝对坐标和方向,在播放动画时,Unity会根据Animation中记录的值,直接修改游戏对象的坐标和方向,每一帧的坐标和方向都是通过插值计算得出来的&…

【Camera KMD ISP SubSystem笔记】Request 流转与Bubble机制

ISP中断类型 SOF: 一帧图像数据开始传输 EOF: 一帧图像数据传输完成 REG_UPDATE: ISP寄存器更新完成(每个reg group都有独立的这个中断) EPOCH: ISP某一行结尾(默认20)就会产生此中断 BUFFER DONE: 一帧图像数据ISP完全写到DDR了 管理Isp request的几个List st…

锂电池SOH预测 | 基于CNN的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

AMBA-CHI协议详解(二)

《AMBA 5 CHI Architecture Specification》 文章目录 2.1 Channels综述2.2 Channel域段2.2.1 request fields2.2.2 Response fields2.2.3 Snoop request fields2.2.4 Data fields 2.3 事务结构2.3.1 Read transactions2.3.1.1 Allocating Read2.3.1.2 Non-allocating Read 2.…

字符串类型漏洞之updatexml函数盲注

UPDATEXML 是 MySQL 数据库中的一个函数,它用于对 XML 文档数据进行修改和查询。然而,当它被不当地使用或与恶意输入结合时,它可能成为 SQL 注入攻击的一部分,从而暴露敏感信息或导致其他安全漏洞。 在 SQL 注入攻击中&#xff0…

通过Cmake官网下载.gz文件安装最新版本的CMAKE、适用于debian

1.前往官网下载最新版本debian https://cmake.org/download/ 2.选他 3. 通过XFTP传输到服务器 4. 解压文件 #cd 进入对应目录,然后执行下面命令解压 $ tar -zxvf cmake-3.29.2.tar.gz5.执行这个文件 $ ./bootstrap6.完成之后再执行这个 $ make7.然后&#xff…

C语言--贪吃蛇小游戏

目录 一、Win32API介绍 1.1Win32API 1.2控制台程序 1.3控制台屏幕上的坐标COORD 1.4GetStdHandle 1.5GetConsoleCursorInfo 1.6 CONSOLE_CURSOR_INFO 1.7 SetConsoleCursorInfo 1.8SetConsoleCursorPosition 1.9GetAsyncKeyState 二、贪吃蛇游戏设计与分析 2.1地图 …

双重注意力模块 DoubleAttention | A2-Nets: Double Attention Networks

论文名称:《 A 2 A^2 A2-Nets: Double Attention Networks》 论文地址:https://arxiv.org/pdf/1810.11579.pdf 学习捕捉远距离关系对于图像/视频识别是基础性的。现有的CNN模型通常依靠增加深度来建模这些关系,这在很大程度上效率低下。在这…

数字旅游打造个性化旅行体验,科技让旅行更精彩:借助数字技术,旅行者可以定制专属旅行计划,享受个性化的旅行体验

目录 一、引言 二、数字旅游的兴起与发展 三、数字技术助力个性化旅行体验 1、智能推荐系统:精准匹配旅行者需求 2、定制化旅行计划:满足个性化需求 3、实时互动与分享:增强旅行体验 四、科技提升旅行便捷性与安全性 1、移动支付与电…

boot https ssl 使用http协议访问报错

在springboot中配置ssl以后, 再次使用http访问对应的接口就会报错 可以考虑如下设置,将http访问的端口重定向到https对应的端口 import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util…

图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

目录 1排除伪孤立点(断裂链表)方法1 限制链表的长度方法2 增加判断条件排除断裂链表方法3 排除不必要跟踪的轮廓(推荐用这个方法) P129 轮廓跟踪算法的硬件加速方案 1排除伪孤立点(断裂链表) 如果图像中某…

探索开源的容器引擎--------------Docker容器操作

目录 一、Docker 容器操作 1.1容器创建 1.2查看容器的运行状态 1.3启动容器 1.4创建并启动容器 1.4.1当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是: 1.4.2在后台持续运行 docker run 创建的容器 1.4.3创建容器并持续运行容器…

Pytorch基础:torch.load_state_dict()方法在加载时不会检查类型

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 笔者在使用torch.nn.module的load_state_dict中出现了一个问题,一个被注册的张量在加载后居然没有变化,一开始以为是加载出现了问题&#…

Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成

Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成 4. Java应用场景——SpringBoot集成4.1 创建SpringBoot项目4.1.1 创建SpringBoot项目4.1.2 修改pom.xml文件4.1.3 在resources中增加application.yml文件 4.2 编写功能代码4.2.1 创建配置…

debian配置BIND DNS服务器

前言 局域网内有很多台主机,IP难以记忆。 而修改hosts文件又难以做到配置共享和统一,需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog,将其指向为192.168.1.100。 同时,外网的域名不会受到影响,…

基于粒子滤波器的电池剩余使用寿命计算matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 粒子滤波器基础 4.2 电池剩余使用寿命建模与预测 4.3 粒子滤波器在电池寿命预测中的应用 5.完整工程文件 1.课题概述 基于粒子滤波器的电池剩余使用寿命计算。根据已知的数据,预测未来…

前端框架编译器之模板编译

编译原理概述 编译原理:是计算机科学的一个分支,研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言:Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码:机器码、汇…

高级IO|从封装epoll服务器到实现Reactor服务器|Part1

从封装epoll_server到实现reactor服务器(part1) 项目复习:从封装epoll_server到实现reactor服务器(part1)EPOLL模式服务器初步 select, poll, epoll的优缺点epoll的几个细节封装epoll_server基本框架先写好创建监听套接字和创建epoll模型可以Accept了吗&#xff1f…

鸿蒙OpenHarmony【轻量系统 运行】 (基于Hi3861开发板)

运行 联网配置 由于Hi3861为WLAN模组,您可以在版本编译及烧录后,通过如下操作,使开发板实现联网功能。 保持Windows工作台和Hi3861 WLAN模组的连接状态,确认串口终端显示正常。 复位Hi3861 WLAN模组,终端界面显示“…