.NET Core使用SkiaSharp快速生成二维码( 真正跨平台方案)

前言

在.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}
}

参考文章

  • https://learn.microsoft.com/zh-cn/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only

  • QRCoder:https://github.com/codebude/QRCoder

项目源码地址

更多实用功能特性欢迎前往开源地址查看👀,别忘了给项目一个Star💖。

https://github.com/mono/SkiaSharp

https://github.com/guitarrapc/SkiaSharp.QrCode

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发效率和质量。坑已挖,欢迎大家踊跃提交PR,自荐(让优秀的项目和框架不被埋没🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外汇天眼:Alpha Group International在2023财年实现营收同比增长12%

Alpha Group International plc&#xff0c;一家为企业和机构提供金融解决方案的公司&#xff0c;今天发布了截至2023财年的贸易更新。 营收增长12%&#xff0c;达到1.1亿英镑&#xff08;2022财年&#xff1a;9830万英镑&#xff09;。 税前利润增长超过140%&#xff0c;达到…

xhr、jQuery、axios、fetch、vue-resource简单了解和对比

1. xhr 不常用&#xff08;太麻烦&#xff09;&#xff0c;一般进行二次封装&#xff0c;或者使用成型的第三方封装jQuery&#xff0c;axios等。axios和jQuery都是对xhr的封装。 2. jQuery 核心是封装Dom操作&#xff0c;80%的内容都是关于Dom的&#xff0c;Vue和React的使用…

第16章_网络编程拓展练习(TCP编程,UDP编程)

文章目录 第16章_网络编程拓展练习TCP编程1、学生与老师交互2、查询单词3、拓展&#xff1a;查询单词4、图片上传5、拓展&#xff1a;图片上传6、多个客户端上传文件7、群聊 UDP编程8、群发消息 第16章_网络编程拓展练习 TCP编程 1、学生与老师交互 案例&#xff1a;客户端模…

Qt程序如何在Release模式下进行断点调试

有些时候,因为某些工程pro文件设置了debug和Release版本的原因,导致在编译运行的时候,程序会自动生成带d后缀的一些库文件,进行调试。 debug模式下我们打断点进行调试,大家都知道。但是Release模式下,如果你直接Ctrl + R运行,肯定是无法断点调试的。 那么这个时候,我…

AEB滤镜再破碎,安全焦虑「解不开」?

不久前&#xff0c;理想L7重大交通事故&#xff0c;再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示&#xff0c;碰撞发生前3秒&#xff0c;车速在178km/h时驾驶员采取了制动措施&#xff0c;但车速大幅超出AEB&#xff08;自动紧急刹车系统&#xff09;的工作范…

如何搭建Z-blog网站并结合内网穿透实现无公网ip访问本地站点

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

hadoop下载,安装

下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/ 从清华源下载 找到apache 找到hadoop 找到对应的版本 使用64位版本 上传到linux的 /usr/local 目录下 使用tar -zxvf 文件。 命令解压 添加path路径 1&#xff0c;vim /etc/profile 2, 追加hadoop的两个bin路径…

Ps:使用钢笔工具快速精准抠图的技巧

众所周知&#xff0c;钢笔工具是 Photoshop 中最精准的、适用于硬边缘&#xff08;清晰轮廓&#xff09;对象的抠图工具。但是&#xff0c;如果从头开始一个锚点一个锚点的勾勒&#xff0c;既费时又费眼。 我们可以先用选区工具或选区命令做一个基础选区&#xff0c;然后将选区…

【Linux】权限的深度解析

前言&#xff1a;在此之前我们学习了一些常用的Linux指令&#xff0c;今天我们进一步学习Linux下权限的一些概念 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的学习 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的学习日记&a…

python实现图片式PDF转可搜索word文档[OCR](已打包exe文件)

目录 1、介绍 1.1、痛点 1.2、程序介绍 2、安装方式 2.1、&#x1f53a;必要环节 2.2、脚本安装 2.2.1、不太推荐的方式 2.2.2、节约内存的方式 2.3、⭐完整版安装 3、使用 3.1、最终文件目录 3.2、主程序 3.2.1、绝对路径 3.2.2、是否为书籍 3.2.3、⭐截取区域 …

lvgl移植流程

移植准备 基于梁山派屏幕扩展板mcu屏幕源码Screen_MCU移植下载lvgl 8.3版本源码下载地址:https://github.com/lvgl/lvgl参考文档:Set-up a project — LVGL documentation 移植步骤 1. 删除源码 删除源码中不需要的文件夹&#xff0c;仅保留如下内容 demos : lvgl综合案例e…

QtCreator12无法识别Qt5.15.2的安卓SDK与NDK配置解决

解决方法: 设置JDK为JDK11 使用Android Studio下载 Android SDK Command-line Tools 10.0 打开Android SDK Location : 双击打开cmdline-tools 复制10.0中所有东西到latest中 点击Manage Kits并选择Devices 然后点击Android会弹出下图窗口,并自动更 安装完成 成功识别

股票套牢,如何解套?当下行情怎么赚钱?

今年开年大盘继续一路下行&#xff0c;今天更是直接跌破2800点&#xff0c;很多朋友都是套牢的阶段&#xff0c;这种时候我们怎样解套&#xff0c;在这种情况下&#xff0c;作为散户的我们又如何才可以赚到钱呢&#xff1f; 股票被套可以借用哪些工具解套&#xff1f;详细操作…

新数智空间:阿里云边缘云持续保持中国公有云市场第一

全球领先的 IT 市场研究和咨询公司 IDC 发布 《中国边缘云市场解读&#xff08;2023H1&#xff09;》报告 中国边缘公有云服务市场 阿里云持续第一 稳居市场第一&#xff0c;“边缘”逆势生长 近日&#xff0c;全球领先的 IT 市场研究和咨询公司 IDC 最新发布《中国边缘云市…

Git学习笔记(第2章):Git安装

官网地址&#xff1a;Githttps://git-scm.com/ Step1&#xff1a;查看Git的GNU协议 → 点击“Next” Step2&#xff1a;设置Git的安装位置(非中文、无空格的目录) → 点击“Next” Step3&#xff1a;选择Git的选项配置(推荐默认设置) → 点击“Next” Step4&#xff1a;设置Git…

POI实现Excel多行复杂表头导出

POI实现Excel多行复杂表头导出 1. pom文件添加POI相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.10-FINAL</version> </dependency> <dependency><groupId>o…

python代码练习:链表——分隔链表

参考知识&#xff1a; 什么是链表Optional有什么用 题目&#xff1a; 题目来源&#xff1a;力扣 代码&#xff1a; from typing import Optionalclass ListNode: 链表结点的数据类型 def __init__(self, val0,nextNone):self.val valself.next nextdef convert_to_linked…

index_jsp报错

今天跟着视频一模一样敲代码&#xff0c;一直报500 搜索了好几篇csdn&#xff0c;不断地修改添加的jstl.jar 和standard.jar&#xff0c;修改这两个jar包版本&#xff0c;还是报500 又看到说是因为tomcat10中存在jsp.jar&#xff0c;同时存在发生冲突&#xff0c;于是把tomcat…

字符型在内存中的存储

由于此字符型只占一个字节 所以它就不存在大端存储和小端存储。 字符型数据在内存中的存储的是ASCII码值转换成的二进制的补码&#xff08;有符号char的二进制也有原码&#xff0c;反码&#xff0c;补码之分&#xff09; 例 ↑的十进制的ASCII值为24 转换成二进制为00011000…

docker里Java服务执行ping命令模拟流式输出

文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户&#xff0c;一直使用CS版本的信控平台&#xff0c;直接安装客户Windows server服务器上&#xff0c;主要对信号机设备进行在线管理、方案配时…