前言
二维码(QR Code),与传统的一维码,比如条形码,二维码具有存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后还可以正常读取);空间利用率高等优点。
因此,二维码在我们的生活中被广泛应用,例如支付码、健康码等。
SkiaSharp.QrCode介绍
虽然已经有很多生成二维码的解决方案,但是它们大多依赖System.Drawing,而在Linux下需要考虑System.Drawing的GDI+兼容性问题(需要安装libgdiplus)。
如果要实现真正的跨平台二维码生成方案,可以试试SkiaSharp.QrCode,因为它完全不依赖GDI和System.Drawing。
Demo
引用Nuget包SkiaSharp.QrCode
,然后编写如下代码:
var content = "My IO";
//创建生成器
using (var generator = new QRCodeGenerator())
{
// 设置错误校正能力(ECC)级别
var qr = generator.CreateQrCode(content, ECCLevel.H);
// 创建一个Canvas
var info = new SKImageInfo(512, 512);
using (var surface = SKSurface.Create(info))
{
var canvas = surface.Canvas;
// 渲染二维码到Canvas
canvas.Render(qr, info.Width, info.Height);
// 输出到文件
using (var image = surface.Snapshot())
using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
using (var stream = File.OpenWrite(@"QRCode.png"))
{
data.SaveTo(stream);
}
}
}
结论
生成二维码最关键的是ECC级别设置,具体取决于最终图像计划使用的场合,是否容易被污损或遮挡:
-
L:最大纠错率7%
-
M:最大纠错率15%
-
Q:最大纠错率25%
-
H:最大纠错率30%
比如上面生成的二维码,我覆盖了一张Logo图片,还是可以正常识别的: