.NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现

在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging ,给出的理由如下:

System.Drawing命名空间对某些操作系统和应用程序类型有一些限制。

  1. 在Windows, System.Drawing 依赖于GDI+操作系统附带的本机库。 某些Windows SKUS Windows Server Core 或 Windows Nano)不包含此本机库作为 OS 的一部分。 如果使用此命名空间并且无法加载库,则运行时将引发异常。

  2. 命名空间中的某些类型依赖于 GDI+ ,而 Windows 服务以及 ASP.NET Core 和 System.Drawing ASP.NET 应用不支持。 这些类型在System.Drawing.Common NuGet包中,并包括 System.Drawing.Bitmap 和 System.Drawing.Font 。 但是,命名空间中的基元类型(如 System.Drawing.Color 、、 和 System.Drawing.Size System.Drawing.Point System.Drawing.Rectangle )可以在任何应用程序中使用。

  3. 在 .NET 5 和早期版本中,System.Drawing.Common NuGet 包适用于 Windows、Linux 和 macOS。 但是,存在一些平台差异。 在 Linux 和 macOS 上,GDI+功能由libgdiplus) 库实现。 默认情况下,大多数 Linux 发行版中不会安装此库,也不支持 GDI+ 和 macOS 上Windows的所有功能。 还有一些平台,其中 libgdiplus 完全不可用。 若要在 Linux 和 macOS 上使用 System.Drawing.Common 包中的类型,必须单独安装 libgdiplus。 有关详细信息,请参阅在Linux 上安装 .NET或在macOS 上安装 .NET。

  4. 在 .NET 6 及更高版本中,System.Drawing.Common NuGet 包仅在 Windows操作系统上受支持。 有关详细信息,请参阅 仅支持System.Drawing.Common Windows。

所以我将项目中原先使用 System.Drawing.Imaging 实现的方法采用 SkiaSharp 进行了重写。
SkiaSharp是 Google 的Skia 图形库的 .NET 包装器,可用于跨移动、服务器和桌面平台绘制 2D 图形。SkiaSharp 可与 OpenGL 一起用于硬件加速渲染。SkiaSharp 最初由 Mono 开发,但现在由 Microsoft 维护,并根据MIT License提供。

依赖的 Nuget 组件如下:

  1. SkiaSharp

  2. SkiaSharp.NativeAssets.Linux

  3. SkiaSharp.QrCode

using SkiaSharp.QrCode;namespace Common
{public class ImgHelper{/// <summary>/// 生成二维码/// </summary>/// <param name="text">二维码内容</param>/// <returns></returns>public static byte[] GetQrCode(string text){using QRCodeGenerator generator = new();using var qr = generator.CreateQrCode(text, ECCLevel.L);SKImageInfo info = new(500, 500);using var surface = SKSurface.Create(info);using var canvas = surface.Canvas;canvas.Render(qr, info.Width, info.Height, SKColors.White, SKColors.Black);using var image = surface.Snapshot();using var data = image.Encode(SKEncodedImageFormat.Png, 100);return data.ToArray();}/// <summary>/// 从图片截取部分区域/// </summary>/// <param name="fromImagePath">源图路径</param>/// <param name="offsetX">距上</param>/// <param name="offsetY">距左</param>/// <param name="width">宽度</param>/// <param name="height">高度</param>/// <returns></returns>public static byte[] Screenshot(string fromImagePath, int offsetX, int offsetY, int width, int height){using var original = SKBitmap.Decode(fromImagePath);using SKBitmap bitmap = new(width, height);using SKCanvas canvas = new(bitmap);SKRect sourceRect = new(offsetX, offsetY, offsetX + width, offsetY + height);SKRect destRect = new(0, 0, width, height);canvas.DrawBitmap(original, sourceRect, destRect);using var img = SKImage.FromBitmap(bitmap);using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);return p.ToArray();}/// <summary>/// 获取图像数字验证码/// </summary>/// <param name="text">验证码内容,如4为数字</param>/// <returns></returns>public static byte[] GetVerifyCode(string text){int width = 128;int height = 45;Random random = new();//创建bitmap位图using SKBitmap image = new(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);//创建画笔using SKCanvas canvas = new(image);//填充背景颜色为白色canvas.DrawColor(SKColors.White);//画图片的背景噪音线for (int i = 0; i < (width * height * 0.015); i++){using SKPaint drawStyle = new();drawStyle.Color = new(Convert.ToUInt32(random.Next(Int32.MaxValue)));canvas.DrawLine(random.Next(0, width), random.Next(0, height), random.Next(0, width), random.Next(0, height), drawStyle);}//将文字写到画布上using (SKPaint drawStyle = new()){drawStyle.Color = SKColors.Red;drawStyle.TextSize = height;drawStyle.StrokeWidth = 1;float emHeight = height - (float)height * (float)0.14;float emWidth = ((float)width / text.Length) - ((float)width * (float)0.13);canvas.DrawText(text, emWidth, emHeight, drawStyle);}//画图片的前景噪音点for (int i = 0; i < (width * height * 0.6); i++){image.SetPixel(random.Next(0, width), random.Next(0, height), new SKColor(Convert.ToUInt32(random.Next(Int32.MaxValue))));}using var img = SKImage.FromBitmap(image);using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);return p.ToArray();}}}

项目如果是在 windows 服务器下运行则不需要任何安装任何依赖项,如果是在 linux 服务下运行则需要安装 libfontconfig1,如 ubuntu 的安装命令

apt-get update
apt-get -y install libfontconfig1

如果是采用 docker 模式运行,则需要在 dockerfile 中添加如下配置,该命令适用于 debian 和 ubuntu 的 docker
RUN apt-get update && apt-get -y install libfontconfig1

至此 .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现 就讲解完了,有任何不明白的,可以在文章下面评论或者私信我,欢迎大家积极的讨论交流,有兴趣的朋友可以关注我目前在维护的一个 .NET 基础框架项目,项目地址如下
https://github.com/berkerdong/NetEngine.git
https://gitee.com/berkerdong/NetEngine.git

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

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

相关文章

Linux运维人员必会开源运维工具体系

新手必会用深&#xff08;8-15k&#xff09;标记&#xff0c;老鸟必会深浅蓝色(15-25K)标记操作系统&#xff1a;Centos,Ubuntu,Redhat,suse,Freebsd网站服务&#xff1a;nginx,apache,lighttpd,php,tomcat,resin数据 库&#xff1a;MySQL,MariaDB,PostgreSQLDB中间件&#x…

unity读取Text

sing UnityEngine;using System.Collections;using System.IO; //需要导入System.IO&#xff0c;主要使用它的File类public class TextTest : MonoBehaviour { private string Mytxt; //用来存放文本内容 void Start() { Mytxt ReadFile("C:\\Users\\Admin\\Desktop\\测试…

hibernate mysql 主从_MYSQL主从复制和写分离

基础篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

深入剖析Redis系列(五) - Redis数据结构之字符串

前言 字符串类型 是 Redis 最基础的数据结构。字符串类型 的值实际可以是 字符串&#xff08;简单 和 复杂 的字符串&#xff0c;例如 JSON、XML&#xff09;、数字&#xff08;整数、浮点数&#xff09;&#xff0c;甚至是 二进制&#xff08;图片、音频、视频&#xff09;&am…

全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理

本系列前面的五篇文章主要介绍Dora.Interception的编程模式以及对它的扩展定制&#xff0c;现在我们来聊聊它的设计和实现原理。目录一、调用链抽象二、基于约定的拦截器定义三、基于调用上下文的依赖注入容器四、拦截器的提供五、调用链的构建六、方法拦截的实现原理七、依赖注…

activemq 安全连接

一、定义用户组1.1 simpleAuthenticationPlugin通过在activemq.xml中配置用户组<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username"admin" password"password" groups"admins,publishers,consumer…

React Native在Android当中实践(五)——常见问题

React Native在Android当中实践&#xff08;一&#xff09;——背景介绍 React Native在Android当中实践&#xff08;二&#xff09;——搭建开发环境 React Native在Android当中实践&#xff08;三&#xff09;——集成到Android项目当中 React Native在Android当中实践&#…

完成登录与注册页面的前端

完成登录与注册页面的HTMLCSSJS&#xff0c;其中的输入项检查包括&#xff1a; 用户名6-12位 首字母不能是数字 只能包含字母和数字 密码6-12位 注册页两次密码是否一致 JS&#xff1a; function fnLogin() {var uSer document.getElementById("user");var pAss do…

mysql505复位密码_mysql5 如何复位根用户密码[官方文档]

如何复位根用户密码如果你从未为MySQL设置根用户密码&#xff0c;服务器在以根用户身份进行连接时不需要密码。但是&#xff0c;建议你为每个账户设置密码如果你以前设置了根用户密码&#xff0c;但却忘记了该密码&#xff0c;可设置新的密码。下述步骤是针对Windows平台的。在…

WPF效果第二百零一篇之实现合并单元格

早一段时间又一次出差青海省西宁市;回来又是总结又是各种琐事,也没顾得上去分享点东西;大周末的就在家分享一下,这二天再次基于ListBox实现的合并单元格的效果:1、ListBox嵌套ListBox的前台布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

转载 maven 详解 http://www.cnblogs.com/binyue/p/4729134.html

--声明规范 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--声…

ASP.NET Core中使用EasyCaching作为缓存抽象层

简介做后端开发&#xff0c;缓存应该是天天在用&#xff0c;很多时候我们的做法是写个帮助类&#xff0c;然后用到的时候调用一下。这种只适合简单层次的应用&#xff1b;一旦涉及到接口实现调整之类的&#xff0c;这种强耦合的做法很不合适。有些其他的功能又要去重复造轮子。…

mysql qps如何查看_mysql状态查看 QPS/TPS/缓存命中率查看

运行中的mysql状态查看对正在运行的mysql进行监控&#xff0c;其中一个方式就是查看mysql运行状态。(1)QPS(每秒Query量)QPS Questions(or Queries) / uptimemysql > show global status like Question%;mysql > show global status like uptime%;(2)TPS(每秒事务量…

visual studio开启多核编译方法

先按http://blog.csdn.net/acaiwlj/article/details/50240625的方法进行了VS多线程的启动。 原本以为按以下步骤设置就OK了&#xff0c;但是编译中无意间发些了一个warning&#xff1a;“/Gm”与多处理不兼容&#xff1b;忽略 /MP 开关&#xff01;&#xff01;&#xff01;&am…

聊聊storm nimbus的LeaderElector

为什么80%的码农都做不了架构师&#xff1f;>>> 序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java public static void main(String[] args) throws Exception {Utils.setupDefaultUncaughtExceptionHandler();…

Android框架式编程之BufferKnife

BufferKnife作为框架式编程的重要组成部分&#xff0c;使用BufferKnife能够极大的精简View层面的代码量&#xff0c;并为MVP/MVC方式提供辅助。 一、配置 compile com.jakewharton:butterknife:(insert latest version) annotationProcessor com.jakewharton:butterknife-compi…

如果我去深圳,你会见我吗

▲图/ 深圳夜景初次见易小姐&#xff0c;还是21年的春节回老家的时候。想来20年因为疫情没有回家&#xff0c;家母几次三番电话里头表达的思念以及建议一些不靠谱的回家计划&#xff0c;着实有些不忍&#xff0c;确实有似“儿行千里母担忧”之理&#xff0c;索性拿着年假和加班…

CodeForces - 1059D(二分+误差)

链接&#xff1a;CodeForces - 1059D 题意&#xff1a;给出笛卡尔坐标系上 n 个点&#xff0c;求与 x 轴相切且覆盖了所有给出点的圆的最小半径。 题解&#xff1a;二分半径即可。判断&#xff1a;假设当前二分到的半径是 R &#xff0c;因为要和 x 轴相切&#xff0c;所以圆心…

pureref 平移用不了_关于参考图管理神器 PureRef 的一些快捷键

PureRef 的一些快捷键 软件下载&#xff1a;点击这里控制(配合左键)窗口内鼠标左键     框选窗口边鼠标左键     调整窗口大小鼠标中键 或 按住Alt     移动画布鼠标滚轮 或 按住Z     缩放画布按住S     查看目标位置颜色信息(可复制16进制颜色…

Windows 10 版本信息

Windows 10 版本信息 原文 https://technet.microsoft.com/zh-cn/windows/release-info Windows 10 版本信息 Microsoft 已更新其服务模型。 半年频道每年发布两次功能更新&#xff0c;时间大概在 3 月和 9 月&#xff0c;每个版本的服务时间线为 18 个月。 从 Windows 10 版本…