当前位置: 首页 > news >正文

.NET 跨平台图形库 SkiaSharp 基础应用

写在前面

SkiaSharp 是适用于 .NET 和 C# 的 2D 图形系统,由开源 Skia 图形引擎提供支持,在 Google 产品中广泛使用。 可以在应用程序中使用 SkiaSharp Xamarin.Forms 绘制 2D 矢量图形、位图和文本。支持跨平台,Windows、Linux、Anroid、IOS、WebAssembly下都可以使用,底层源码是用C++实现的。

SkiaSharp 最初由 Mono 开发,目前由 Microsoft 维护,遵循 MIT License。

 SkiaSharp 图形 Xamarin.Forms - Xamarin | Microsoft Learn

在Winform中使用时,可以从NuGet 获取 SkiaSharp 类库

为了方便使用,把SKImage直接转换成Bitmap,需要再引入一个拓展类库,SkiaSharp.Views.Desktop.Common

 

代码实现

using SkiaSharp;
using SkiaSharp.Views.Desktop;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace SkiaSharpDemo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void btnGenerate_Click(object sender, EventArgs e){//图片宽度var width = 128;//图片高度var height = 36;//生成随机验证码var code = CreateValidateCode(4);// 创建一个SkiaSharp画布  using (var surface = SKSurface.Create(new SKImageInfo(width, height))){var canvas = surface.Canvas;// 清除画布  canvas.Clear(SKColors.White);// 使用SkiaSharp绘制验证码文本  using (var textPaint = new SKPaint()){textPaint.Color = SKColors.Black;textPaint.IsAntialias = true;textPaint.TextSize = height * 0.8f; // 设置文本大小  textPaint.StrokeWidth = 3;var textBounds = new SKRect();textPaint.MeasureText(code, ref textBounds);var xText = (width - textBounds.Width) / 2;var yText = (height - textBounds.Height) / 2 - textBounds.Top;canvas.RotateDegrees(-5, 0, 0); // 加一点点旋转角度canvas.DrawText(code, xText, yText, textPaint);}// 绘制干扰线  using (var linePaint = new SKPaint()){// 半透明蓝色  linePaint.Color = new SKColor(0, 0, 255, 128);linePaint.StrokeWidth = 2;linePaint.IsAntialias = true;var random = new Random();for (int i = 0; i < 8; i++) // 绘制5条干扰线  {float x1 = 0;float y1 = random.Next(height);float x2 = width;float y2 = random.Next(height);canvas.DrawLine(x1, y1, x2, y2, linePaint);}}// 保存图像到文件  using (var image = surface.Snapshot()){picTarget.Image = image.ToBitmap();}}}// 可选字符集  private const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";private string CreateValidateCode(int len){// 创建一个新的随机数生成器  var random = new Random();// 生成验证码  string code = new string(Enumerable.Repeat(chars, len).Select(s => s[random.Next(s.Length)]).ToArray());return code;}}
}

调用示例

相关文章:

  • php 面向对象与反序列
  • 利用Java正则表达式提取HTML中的链接
  • 【QT】文本文件读写
  • C#,生成图片的指定尺寸缩略图的源代码
  • SpringMVC-异常处理
  • Golang 中如何实现 Set
  • ARM day7 day8 UART串口、PWM蜂鸣器、WDT看门狗、ADC数模转换
  • 电脑加固态硬盘有什么好处
  • Google的guava缓存学习使用
  • vue创建组件和使用
  • 去除 inline-block 元素间间距的方法
  • c语言不定参数
  • html+css+javascript实现贪吃蛇游戏
  • C++高级编程——STL:list容器、set容器和map容器
  • Pytest基础
  • 【node学习】协程
  • 3.7、@ResponseBody 和 @RestController
  • ES6语法详解(一)
  • Go 语言编译器的 //go: 详解
  • Otto开发初探——微服务依赖管理新利器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 创建一个Struts2项目maven 方式
  • 从重复到重用
  • 服务器从安装到部署全过程(二)
  • 数据可视化之 Sankey 桑基图的实现
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 阿里云API、SDK和CLI应用实践方案
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​Linux·i2c驱动架构​
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • %check_box% in rails :coditions={:has_many , :through}
  • (2)(2.10) LTM telemetry
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)hibernate配置管理
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (七)Knockout 创建自定义绑定
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)【Hibernate总结系列】使用举例
  • (转)scrum常见工具列表
  • (转载)Linux 多线程条件变量同步
  • .Net6使用WebSocket与前端进行通信
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net反编译的九款神器
  • .Net语言中的StringBuilder:入门到精通
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians