虽然已经有很多生成二维码的解决方案,但是它们大多依赖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
下载!