当前位置: 首页 > 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基础
  • [译]如何构建服务器端web组件,为何要构建?
  • 【React系列】如何构建React应用程序
  • 2017-09-12 前端日报
  • Angular2开发踩坑系列-生产环境编译
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java 多线程编程之:notify 和 wait 用法
  • Linux后台研发超实用命令总结
  • Promise面试题2实现异步串行执行
  • Python 基础起步 (十) 什么叫函数?
  • react-native 安卓真机环境搭建
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端性能优化——回流与重绘
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • hi-nginx-1.3.4编译安装
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • $.ajax()
  • (09)Hive——CTE 公共表达式
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (算法)前K大的和
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .Net IOC框架入门之一 Unity
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net下简单快捷的数值高低位切换
  • /proc/vmstat 详解
  • [20171102]视图v$session中process字段含义
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [Avalon] Avalon中的Conditional Formatting.
  • [BZOJ3757] 苹果树
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行