虽然已经有很多生成二维码的解决方案,但是它们大多依赖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()Convert.ToBase64String(array,0,array.Length)}";
ViewBag.Base64String = Base64String;

前端代码:

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

一个.NET开发的开源跨平台二维码生成库-LMLPHP
看起来还不错。

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

本文完整DEMO下载:

10-06 15:07