当前位置: 代码网 > it编程>编程语言>Asp.net > .NET Core使用SkiaSharp实现快速生成二维码

.NET Core使用SkiaSharp实现快速生成二维码

2024年05月15日 Asp.net 我要评论
前言在.net 6之前我们一直是使用qrcoder来生成二维码(qrcoder是一个非常强大的生成二维码的组件,用到了system.drawing.common 包),然后从.net 6开始,当为非

前言

在.net 6之前我们一直是使用qrcoder来生成二维码(qrcoder是一个非常强大的生成二维码的组件,用到了system.drawing.common 包),然后从.net 6开始,当为非 windows 操作系统编译引用代码时,平台分析器会发出编译时警告。异常如下:

system.typeinitializationexception : the type initializer for 'gdip' threw an exception.
      ---- system.platformnotsupportedexception : system.drawing.common is not supported on non-windows platforms. see https://aka.ms/systemdrawingnonwindows for more information.
      stack trace:
           at system.drawing.safenativemethods.gdip.gdipcreatebitmapfromfile(string filename, intptr& bitmap)
        /_/src/libraries/system.drawing.common/src/system/drawing/bitmap.cs(42,0): at system.drawing.bitmap..ctor(string filename, boolean useicm)
        /_/src/libraries/system.drawing.common/src/system/drawing/bitmap.cs(25,0): at system.drawing.bitmap..ctor(string filename)
        /_/src/libraries/system.resources.resourcemanager/tests/resourcemanagertests.cs(270,0): at system.resources.tests.resourcemanagertests.englishimageresourcedata()+movenext()
        /_/src/libraries/system.linq/src/system/linq/select.cs(136,0): at system.linq.enumerable.selectenumerableiterator`2.movenext()
        ----- inner stack trace -----
        /_/src/libraries/system.drawing.common/src/system/drawing/libraryresolver.cs(31,0): at system.drawing.libraryresolver.ensureregistered()
        /_/src/libraries/system.drawing.common/src/system/drawing/gdiplusnative.unix.cs(65,0): at system.drawing.safenativemethods.gdip.platforminitialize()
        /_/src/libraries/system.drawing.common/src/system/drawing/gdiplus.cs(27,0): at system.drawing.safenativemethods.gdip..cctor()

报错原因

由于 system.drawing.common 被设计为 windows 技术的精简包装器,因此其跨平台实现欠佳。

libgdiplus 是本机端 system.drawing.common 跨平台实现的主要提供程序。libgdiplus 实际上是对 system.drawing.common 所依赖的 windows 部分的重新实现。该实现使 libgdiplus 成为一个重要的组件。它大约有 30,000 行 c 代码,大部分未经测试,而且缺少很多功能。libgdiplus 还具有许多用于图像处理和文本呈现的外部依赖项,例如 cairo、pango 和其他本机库。这些依赖项使得维护和交付组件更具挑战性。自从包含 mono 跨平台实现以来,我们已将许多从未得到修复的问题重定向到 libgdiplus。相比之下,我们采用的其他外部依赖项,例如 icu 或 openssl,都是高质量的库。使 libgdiplus 的功能集和质量与 .net 堆栈的其余部分相媲美是不可行的。

官方建议

在非 windows 环境中,推荐使用 skiasharp 和 imagesharp 等库来完成跨平台的图像处理操作。这些库提供了更全面和稳定的功能支持,适用于大多数图形操作需求。而 system.drawing.common 将主要继续在 windows 窗体和 gdi+ 的上下文中进行演化。

skiasharp介绍

skiasharp是由mono团队维护的开源项目,它是基于google的skia图形库的.net跨平台绑定,提供了强大的2d图形绘制和处理功能,适用于多个平台,包括windows、macos、linux、ios和android,可用于创建高性能的、可移植的2d图形应用程序。

skiasharp 提供了跨平台绑定,适用于以下平台:

  • .net standard 1.3
  • .net core
  • .net 6
  • tizen
  • android
  • ios
  • tvos
  • macos
  • mac catalyst
  • winui 3 (windows app sdk / uno platform)
  • windows classic desktop (windows.forms / wpf)
  • web assembly (wasm)
  • uno platform (ios / macos / android / webassembly)

这些平台可以使用 skiasharp 来进行跨平台的图形渲染和绘制操作。

使用skiasharp快速生成二维码

1、安装skiasharp.qrcode库

使用skiasharp生成二维码的qr码生成器(无需使用system.drawing)。

2、生成二维码图片

        /// <summary>
        /// 生成二维码图片
        /// </summary>
        public static void generateqrcode()
        {
            var qrcodecontent = "追逐时光者";
            using (var generator = new qrcodegenerator())
            {
                // 创建二维码(并设置纠错能力最高级)
                var createqrcode = generator.createqrcode(qrcodecontent, ecclevel.h);
 
                var skimageinfo = new skimageinfo(300, 300);
 
                // 创建skiasharp画布
                using (var surface = sksurface.create(skimageinfo))
                {
                    var canvas = surface.canvas;
 
                    // 渲染二维码到画布
                    canvas.render(createqrcode, skimageinfo.width, skimageinfo.height);
 
                    using (var image = surface.snapshot())// 获取画布快照
                    using (var data = image.encode(skencodedimageformat.png, 100))// 编码画布快照为png格式的数据
                    using (var stream = file.openwrite(@"myqrcode.png"))
                    {
                        data.saveto(stream);// 将数据保存到文件流中,生成二维码图片
                    }
                }
            }
        }

二维码的纠错能力通常分为四个级别

在生成二维码时,纠错能力(error correction capability)指的是qr码中包含的冗余信息,用于修复可能出现的损坏或错误。qr码可以通过添加冗余信息来提高其容错性,即使在一定程度上受到损坏或噪声的干扰,仍然可以正确地解码和还原二维码的内容。

qr码的纠错能力通常分为四个级别,从低到高依次为:l、m、q、h。其中,纠错能力最低的级别为l,最高的级别为h。纠错能力越高,二维码中包含的冗余信息就越多,因此可以更好地恢复丢失或损坏的数据。

namespace skiasharp.qrcode
{
    public enum ecclevel
    {
        l,
        m,
        q,
        h
    }
}

以上就是.net core使用skiasharp实现快速生成二维码的详细内容,更多关于.net skiasharp生成二维码的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com