一个.NET开发的开源跨平台二维码生成库

news2024/7/6 19:15:31

虽然已经有很多生成二维码的解决方案,但是它们大多依赖System.Drawing,而.NET 6开始,使用System.Drawing操作图片,在生成解决方案或打包时,会收到一条警告,大致意思是System.Drawing仅在 ‘windows’ 上受支持。如果想避免使用 System.Drawing 来解决 GDI+ 的兼容性问题(需要安装libgdiplus)。可以使用真正的跨平台二维码生成方案SkiaSharp.QrCode,因为它完全不依赖GDI和System.Drawing。

下面使用SkiaSharp.QrCode来生成二维码:
创建一个.NET 项目,并给他起个名字,叫QrCodeDemo吧。

首先安装SkiaSharp.QrCode包:

.NET CLI方式

$ dotnet add package SkiaSharp.QrCode

Package Manager方式

PM> Install-Package SkiaSharp.QrCode

简单生成二维码图片:

//要生成二维码的内容
var qrcode_content = "这是一个二维码";
//输出的图片
using var output = new FileStream(@"wwwroot/qrcode.png", FileMode.OpenOrCreate);
//创建二维码
var qrCode = new QrCode(qrcode_content, new Vector2Slim(256, 256), SKEncodedImageFormat.Png);
//输出图片
qrCode.GenerateImage(output);

运行程序,在wwwroot目录下,会生成一个qrcode.png的二维码图片。
这是可以在xxxx.cshtml中加载二维码图片。

<div>
    <img src="/qrcode.png" width="250" height="250" />
</div>

也可以手动创建二维码,并使用SkiaSharp输出。

var qrcode_content = "这是一个二维码";
using var generator = new QRCodeGenerator();

// 生成二维码
var qr = generator.CreateQrCode(content, ECCLevel.L);

// 将二维码渲染到Canvas
var info = new SKImageInfo(512, 512);
using var surface = SKSurface.Create(info);
var canvas = surface.Canvas;
canvas.Render(qr, info.Width, info.Height);

// 输出文件
using var image = surface.Snapshot();
using var data = image.Encode(SKEncodedImageFormat.Png, 100);
using var stream = System.IO.File.OpenWrite(@"wwwroot/qrcode.png");
data.SaveTo(stream);

运行程序,在wwwroot目录下,会生成一个qrcode.png的二维码图片。

这时就有一个问题,不能每次生成二维码都生成一张图片吧。在实际应用中,虽然不排除每次都要生成一张二维码图片的需求,在大多数情况下,动态生成一张二维码,用就可以了。动态生成图片方面,base64格式是比较常见的一个办法。把上面的代码改造一下。输出一个base64字符串格式的图片,前端加载base64字符串格式的图片就OK了!

改造后的代码:

var qrcode_content = "这是一个二维码";
using var generator = new QRCodeGenerator();

// 生成二维码
var qr = generator.CreateQrCode(qrcode_content, ECCLevel.L);

// 将二维码渲染到Canvas
var info = new SKImageInfo(512, 512);
using var surface = SKSurface.Create(info);
var canvas = surface.Canvas;
canvas.Render(qr, info.Width, info.Height);

// 输出文件
//using var image = surface.Snapshot();
//using var data = image.Encode(SKEncodedImageFormat.Png, 100);
//using var stream = System.IO.File.OpenWrite(@"wwwroot/qrcode.png");
//data.SaveTo(stream);

using var image = surface.Snapshot();
//转为SKData
using SKData data = image.Encode(SKEncodedImageFormat.Png, 100);
var array = data.ToArray();
string  Base64String = $"data:{SKEncodedImageFormat.Png.ToString().ToLower()};base64,{Convert.ToBase64String(array,0,array.Length)}";
ViewBag.Base64String = Base64String;

前端代码:

<div>
    <img src="@(ViewBag.Base64String)" width="250" height="250" />
</div>

在这里插入图片描述
看起来还不错。

SkiaSharp.QrCode代码地址:
https://github.com/guitarrapc/SkiaSharp.QrCode

本文完整DEMO下载:

点击下方公众号卡片,关注我,回复1011 下载!

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

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

相关文章

完美清晰,炫酷畅享——Perfectly Clear Video为你带来卓越的AI视频增强体验

在我们日常生活中&#xff0c;我们经常会拍摄和观看各种视频内容&#xff0c;无论是旅行记录、家庭聚会还是商务演示&#xff0c;我们都希望能够呈现出最清晰、最精彩的画面效果。而现在&#xff0c;有一个强大的工具可以帮助我们实现这一目标&#xff0c;那就是Perfectly Clea…

Spring IoC容器及原理

Spring IoC容器及原理 目录 Spring IoC容器及原理 Spring BeanFactory容器 Spring ApplicationContext容器 Spring容器是Spring框架的核心。容器将创建对象&#xff0c;它们连接在一起&#xff0c;配置它们&#xff0c;并从创建到销毁管理他们的整个生命周期。在Spring容器…

大压缩作用下软基底薄膜周期性分层现象的研究

引言 通过实验、理论模型和有限元模拟的结合&#xff0c;英思特通过将一个薄膜粘接到一个预应变超过400%的软弹性衬底上&#xff0c;探索了微观和宏观尺度上控制周期性屈曲脱层形成和发展的机理。我们发现&#xff0c;在大的基底预应变释放时&#xff0c;膜中的变形遵循三阶段…

好用的截图软件Snipaste2.7.3

官网 Snipaste - 截图 贴图 下载 使用 解压 打开64位 双击运行 查看快捷键&#xff1a;选择图标&#xff0c;右键&#xff0c;弹出查看菜单

CDN体系架构及部署方案探索

如今是科技技术飞速发展的时代&#xff0c;特别是互联网技术在各个方面都得到了质的提升。对于CDN技术来说&#xff0c;该项技术的基本功能、体系构架以及运营部署等方面都取得了长足的发展&#xff0c;不仅技术日新月异&#xff0c;而且整个体系日趋成熟&#xff0c;并且不断朝…

最新Uniapp软件社区-全新带勋章源码

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件夹里面…

Python柱形图

柱形图 柱形图&#xff0c;又称长条图、柱状统计图、条图、条状图、棒形图&#xff0c;是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值&#xff08;不同时间或者不同条件&#xff09;&#xff0c;只有一个变量&#xff0c;通常利用于较小的数据集分析…

C语言之自定义类型_结构体篇(1)

目录 什么是结构&#xff1f; 结构体类型的声明 常规声明 特殊声明-匿名结构体 结构体变量的定义和初始化和访问 定义 初始化 访问 嵌套结构体 结构体的自引用 什么是结构体的自引用 NO1. NO2. 热门考点&#xff1a;结构体内存对齐 产生内存对齐 NO1 NO2 …

【TensorFlow Hub】:有 100 个预训练模型等你用

要访问TensorFlow Hub&#xff0c;请单击此处 — https://www.tensorflow.org/hub 一、说明 TensorFlow Hub是一个库&#xff0c;用于在TensorFlow中发布&#xff0c;发现和使用可重用模型。它提供了一种使用预训练模型执行各种任务&#xff08;如图像分类、文本分析等&#xf…

GPU(国内外发展,概念参数(CUDA,Tensor Core等),类别,如何选型,NPU,TPU)

目录 前言 1.国内外GPU发展简述 2.GPU概念参数和选择标准 2.1 CUDA 2.2 Tensor Core 2.3 显存容量和显存位宽 2.4 精度 2.5 如何选择GPU 3.常见GPU类别和价格 3.1 GPU类别 3.2 GPU价格&#xff08;部分&#xff09; 3.3 GPU云服务器收费标准&#xff08;以阿里云为例&a…

机器学习基础之《回归与聚类算法(1)—线性回归》

一、线性回归的原理 1、线性回归应用场景 如何判定一个问题是回归问题的&#xff0c;目标值是连续型的数据的时候 房价预测 销售额度预测 贷款额度预测、利用线性回归以及系数分析因子 2、线性回归定义 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(…

【多线程进阶】synchronized 原理

文章目录 前言1. 基本锁策略2. 加锁工作过程2.1 偏向锁2.2 轻量级锁2.3 重量级锁 3. 其他的优化操作3.1 锁消除3.2 锁粗化 总结 前言 在前面章节中, 提到了多线程中的锁策略, 那么我们 Java 中的锁 synchronized 背后都采取了哪些锁策略呢? 又是如何进行工作的呢? 本节我们就…

第三课 哈希表、集合、映射

文章目录 第三课 哈希表、集合、映射lc1.两数之和--简单题目描述代码展示 lc30.串联所有单词的子串--困难题目描述代码展示 lc49.字母异位分组--中等题目描述代码展示 lc874.模拟行走机器人--中等题目描述代码展示 lc146.LRU缓存--中等题目描述相关补充思路讲解代码展示图示理解…

提升您的 Go 应用性能的 6 种方法

优化您的 Go 应用程序 1. 如果您的应用程序在 Kubernetes 中运行&#xff0c;请自动设置 GOMAXPROCS 以匹配 Linux 容器的 CPU 配额 Go 调度器 可以具有与运行设备的核心数量一样多的线程。由于我们的应用程序在 Kubernetes 环境中的节点上运行&#xff0c;当我们的 Go 应用程…

美国各流域边界下载,并利用arcgis提取与处理

一、边界数据的下载 一般使用最普遍的流域边界数据是从HydroSHEDS官网下载: HydroBASINS代表一系列矢量多边形图层&#xff0c;以全球尺度呈现次级流域边界。该产品的目标是提供一种无缝的全球覆盖&#xff0c;其中包含了不同尺度&#xff08;从数十到数百万平方千米&#xf…

Docker 配置基础优化

Author&#xff1a;rab 为什么要优化&#xff1f; 你有没有发现&#xff0c;Docker 作为线上环境使用时&#xff0c;Docker 日志驱动程序的日志、存储驱动数据都比较大&#xff08;尤其是在你容器需要增删比较频繁的时候&#xff09;&#xff0c;动不动就好几百 G 的大小&…

P3-Python学习当中的两大法宝函数

P3-Python学习当中的两大法宝函数 实战操作 打开pycharm&#xff0c;在命令行当中先检测是否是在envs当中的pytorch环境里面&#xff0c;或者导入torch包是否成功 dir(torch)//展示torch以下的分隔的工具包证明torch目录以下有cuda包 dir(torch.cuda.is_available())//可以展示…

Springboot学生成绩管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 学生成绩管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

golang gin——controller 模型绑定与参数校验

controller 模型绑定与参数校验 gin框架提供了多种方法可以将请求体的内容绑定到对应struct上&#xff0c;并且提供了一些预置的参数校验 绑定方法 根据数据源和类型的不同&#xff0c;gin提供了不同的绑定方法 Bind, shouldBind: 从form表单中去绑定对象BindJSON, shouldB…

【MVC】C# MVC基础知识点、原理以及容器和管道

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 国庆假期马上结束&#xff0c;闲暇时间&#xff0c;重温一遍C#关于MVC的技术&#xff0c;控制器、视图、模型&#xff0c;知识点和原理&#xff0c;小伙伴们还记得吗 目录 一、MVC知识点1…