使用C#快速生成二维码 | 真正跨平台方案

前言

二维码(QR Code),与传统的一维码,比如条形码,二维码具有存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后还可以正常读取);空间利用率高等优点。

因此,二维码在我们的生活中被广泛应用,例如支付码、健康码等。

SkiaSharp.QrCode介绍

虽然已经有很多生成二维码的解决方案,但是它们大多依赖System.Drawing,而在Linux下需要考虑System.Drawing的GDI+兼容性问题(需要安装libgdiplus)。

使用C#快速生成二维码 | 真正跨平台方案

如果要实现真正的跨平台二维码生成方案,可以试试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图片,还是可以正常识别的:

使用C#快速生成二维码 | 真正跨平台方案

上一篇:View 的软件绘制和硬件绘制


下一篇:2019年百度Android面试题-公共技术点之-View-绘制流程,涨薪7K