C#调用skiasharp操作并绘制图片

  之前学习ViewFaceCore时采用Panel控件和GDI+将图片及识别出的人脸方框和关键点绘制出来,本文将其修改为基于SKControl和SKCanvas实现相同的显示效果并支持保存为本地图片。
在这里插入图片描述
  新建Winform项目,在Nuget包管理器中搜索并安装一下SkiaSharp和ViewFaceCore包,同时在主界面添加SKControl控件。
在这里插入图片描述
  使用SKBitmap类的Decode方法加载本地图片文件,然后在skControl1的PaintSurface事件中调用SKCanvas.DrawBitmap函数绘制图形,函数原型如下所示:
在这里插入图片描述
  对于ViewFaceCore识别出的人脸区域及关键点坐标,调用SKCanvas的DrawRect、DrawCircle绘制矩形和圆形,同时调用DrawText函数绘制人脸区域顺序号,这些函数在GDI+的Graphics类中都有对应的函数,但是函数名又不完全相同,看着很别扭。还有感觉很怪的是DrawRect函数(如下图所示),如果是直接输入矩形坐标(第一行重载函数),参数格式是左上角坐标及矩形宽和高,而输入矩形对象(第二行重载函数),构建矩形对象时输入的是矩形左上角和右下角坐标,同时绘制圆形时输入参数是圆心坐标和半径,并没有像Graphics类中的绘图函数参数模式那么一致(也可能是用GDI+习惯了,还没有转变过来)。

在这里插入图片描述
在这里插入图片描述
    主要绘图代码和运行效果如下所示:

SKCanvas canvas = e.Surface.Canvas;
canvas.Clear();if (m_image != null)
{canvas.DrawBitmap(m_image, new SKRect(m_startX, m_startY, m_startX + m_image.Width * m_scale, m_startY + m_image.Height * m_scale));if (m_faces.Count > 0){using var paint = new SKPaint{Color = SKColors.Red,Style = SKPaintStyle.Stroke,IsAntialias = true,StrokeWidth = 2};for (int i = 0; i < m_faces.Count; i++){canvas.DrawRect(m_startX + m_faces[i].Face.Location.X * m_scale,m_startY + m_faces[i].Face.Location.Y * m_scale,m_faces[i].Face.Location.Width * m_scale,m_faces[i].Face.Location.Height * m_scale,paint);canvas.DrawText(Convert.ToString(i + 1),m_startX + m_faces[i].Face.Location.X * m_scale,m_startY + m_faces[i].Face.Location.Y * m_scale - skControl1.Font.Height * 1.5f,paint);if (m_faces[i].MarkPoints != null && m_faces[i].MarkPoints.Length > 0){foreach (FaceMarkPoint mp in m_faces[i].MarkPoints){canvas.DrawCircle(m_startX + Convert.ToInt32(mp.X) * m_scale, m_startY + Convert.ToInt32(mp.Y) * m_scale, 3 * m_scale, paint);}}}}
}

在这里插入图片描述
  将SKBitmap对象保存到本地的包括以下步骤:
 &emsp1)新建SKBitmap对象;
 &emsp2)基于SKBitmap对象创建SKCanvas对象;
 &emsp3)依次绘制原始图片、人脸区域及关键点坐标;
 &emsp4)将SKBitmap对象数据保存到本地文件,主要有两种方式,第一种是使用bitmap.Encode方法以指定格式写入本地文件流,测试过程中能以png格式保存,其它格式报错,暂时不清楚原因;第二种方式,安装的SkiaSharp.Views包的SkiaSharp.Views.Desktop提供有扩展函数ToBitmap,支持将SKBitmap对象转换为System.Drawing.Bitmap对象,再调用Bitmap对象的Save函数保存为需要的格式即可。主要代码如下:

using SKBitmap bitmap=new SKBitmap(m_image.Width, m_image.Height);
using SKCanvas canvas = new SKCanvas(bitmap);
canvas.DrawBitmap(m_image, 0, 0);if (m_faces.Count > 0)
{......
}canvas.Flush();bitmap.ToBitmap().Save(sfd.FileName, ImageFormat.Bmp);//using (FileStream fsStream = new FileStream(sfd.FileName,FileMode.CreateNew,FileAccess.Write))
//{
//    if(bitmap.Encode(fsStream,SKEncodedImageFormat.Png, 100))
//    {
//        MessageBox.Show("保存成功");
//    }
//}

参考文献:
[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.mzph.cn/bicheng/5364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI工具合集】图片、文本、音视频工具与A I岗位面试资料

1、AI 工具集合 全球最新热门 Al 工具&#xff0c; AI 工具整合包&#xff0c;可以下载并在 Windows 系统私有化本地化运行&#xff0c;包括图片、文本、视频、音频等工具资源&#xff0c;按照功能、业务和行业来分类。 1.1 AI 图片工具 MoneyPrinter&#xff1a;一键生成短…

HTTP 多个版本

了解一下各个版本的HTTP。 上个世纪90年代初期&#xff0c;蒂姆伯纳斯-李&#xff08;Tim Berners-Lee&#xff09;及其 CERN的团队共同努力&#xff0c;制定了互联网的基础&#xff0c;定义了互联网的四个构建模块&#xff1a; 超文本文档格式&#xff08;HTML&#xff09; …

Linux基础——Linux开发工具(上)_vim

前言&#xff1a;在了解完Linux基本指令和Linux权限后&#xff0c;我们有了足够了能力来学习后面的内容&#xff0c;但是在真正进入Linux之前&#xff0c;我们还得要学会使用Linux中的几个开发工具。而我们主要介绍的是以下几个&#xff1a; yum, vim, gcc / g, gdb, make / ma…

【初识Redis】

初识Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;它提供了一个高性能的键值存储系统&#xff0c;并且支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合等。Redis的特点包括&#xff1a; 内存存储&…

bottom-up-attention.pytorch

环境 torch1.5cu 101cp38 on 2080ti # clone the repository inclduing Detectron2(be792b9) $ git clone --recursive https://github.com/MILVLG/bottom-up-attention.pytorch$ cd detectron2 $ pip install -e . $ cd .. detectron2直接克隆有问题&#xff0c;需要把det…

C语言实验-数组、字符串以及指针

一&#xff1a; 求一个NN矩阵主、次对角线上所有元素之和。矩阵输入、矩阵输出、矩阵对角线求和分别用三个子函数实现。&#xff08;N的值由用户从键盘输入&#xff09; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h>void print(int(*arr…

有哪些好用的局域网电脑监控系统软件?

企业员工不好管理&#xff1f;&#xff1f;&#xff1f; 局域网已成为企业日常运营不可或缺的一部分。 然而&#xff0c;随着网络技术的普及&#xff0c;员工在局域网中的不当行为也日益增多&#xff0c;如滥用网络资源、泄露敏感信息、消极怠工等。 为了解决这些问题&#x…

植物大战僵尸杂交版

1.感谢作者潜艇伟伟迷 2.大小大概110M&#xff0c;下载链接在下方 链接&#xff1a;https://pan.baidu.com/s/1Ew6iTg0_d_Ut8N9_18KGLw 提取码&#xff1a;yspa 3.祝大家玩的开心

嵌入式学习——C语言基础——day13

1. 结构体类型的定义 struct 类型名 { 数据类型1 成员变量1; 数据类型2 成员变量2; 数据类型3 成员变量3; ... }; 定义结构体中可以使用的数据类型有 1.基本数据类型&#xff1a;int long short char doub…

C++-10

1.C一个程序&#xff0c;实现两个类&#xff0c;分别存放输入的字符串中的数字和字母&#xff0c;并按各自的顺序排列&#xff0c; 类中实现-一个dump函数&#xff0c;调C用后输出类中当前存放的字符串结果。 例如&#xff0c;输入1u4y2a3d,输出:存放字母的类&#xff0c;输出a…

Mybatis-plus对单表操作的封装

MyBatis-Plus单表操作详解及拓展 MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;它提供了丰富的CRUD操作和分页查询等功能&#xff0c;极大地简化了开发人员的数据库操作。本文将详细介绍MyBatis-Plus官方已经写好的单表操作&#xff0c;并提供一些拓展内容。 1. 引言…

爬虫 - 基于requests进行二次开发

项目地址 https://github.com/markadc/wauo.git持续更新中…

树,二叉树的基本概念介绍,二叉树的性质

目录 树 树的定义 树的相关概念 树的存储结构 树在实际中的运用&#xff08;表示文件系统的目录树结构 &#xff09; 二叉树 二叉树的定义 现实中的二叉树 二叉树的特点 特殊的二叉树 1.斜树 2.满二叉树 3.完全二叉树 二叉树的性质 性质1&#xff1a;二叉树的第…

嵌入式C语言教程:实现DMA控制的高速SPI通信

在高速数据传输应用中&#xff0c;SPI&#xff08;串行外设接口&#xff09;是一种常用的通信协议。 利用DMA&#xff08;直接内存访问&#xff09;进行SPI数据传输可以显著提高数据处理效率&#xff0c;减少CPU的负载。 本文将详细介绍如何在STM32微控制器上配置和使用DMA来…

2012NOIP普及组真题 2. 寻宝

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1958 核心思想&#xff1a;&#xff08;模拟&#xff09; 1、模拟 每一层从起始房间开始&#xff0c;轮询 x 个有楼梯的房间后到达终点房间 2、由于 0 < N ≤ 10000 &#xff0c; 0…

网络基础(1)网络编程套接字UDP

要完成网络编程首先要理解原IP和目的IP&#xff0c;这在上一节已经说明了。 也就是一台主机要进行通信必须要具有原IP和目的IP地址。 端口号 首先要知道进行网络通信的目的是要将信息从A主机送到B主机吗&#xff1f; 很显然不仅仅是。 例如唐僧要去到西天取真经&#xff0…

源码篇--Nacos服务--中章(8):Nacos服务端感知客户端实例变更-3

文章目录 前言一、客户端实例变更&#xff1a;二、实例变更感知&#xff1a;2.1 实例注册信息通知&#xff1a;2.1.1 接收DistroDataRequest 请求&#xff1a;2.1.2 onReceive 处理请求&#xff1a;2.1.3 processData 处理请求&#xff1a;2.1.4 handlerClientSyncData 处理数据…

Optimistic乐观挑战游戏Sharelock审计大赛

1. 引言 Optimistic的Sherlock审计大赛已进入升级期&#xff0c;fault proofs距离OP主网上线又更近一步了。本文将分享一些初步竞赛结果以及通往Stage 1的后续安排。 2. 审计状态更新 2024年3月27日&#xff0c;Optimistic团队开始针对拟议的 OP Stack fault proof系统进行 …

MySQL修改密码过期时间

1、my.ini中设置 [mysqld] #过期时间90天 default_password_lifetime90 2、或者 SET GLOBAL default_password_lifetime 90; 3、或者 ALTER USER usernamehostname PASSWORD EXPIRE INTERVAL 90 DAY; 4、查看过期时间 SHOW VARIABLES LIKE default_password_lifetime; …

k8s集群Grafana精选dashboard页面

文章目录 参考文档 Grafana自选模板推荐模板&#xff1a;13332、13824、14518Grafana默认配置我们选择 Node Exporter/Nodes 的 Dashboard 进去&#xff1a;点击 Kubernetes/Networking/Cluster 进去使用模板查看结果 Grafana接入Prometheus数据Grafana添加监控模板导入 1860_r…