.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
}
}
3、查看生成效果
参考文章
- 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。
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发效率和质量。坑已挖,欢迎大家踊跃提交PR,自荐(让优秀的项目和框架不被埋没
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
加入DotNetGuide技术交流群
1、提供.NET开发者分享自己优质文章的群组和获取更多全面的C#/.NET/.NET Core学习资料、视频、文章、书籍,社区组织,工具和常见面试题资源,帮助大家更好地了解和使用 .NET技术。
2、在这个群里,开发者们可以分享自己的项目经验、遇到的问题以及解决方案,倾听他人的意见和建议,共同成长与进步。
3、可以结识更多志同道合的开发者,甚至可能与其他开发者合作完成有趣的项目。通过这个群组,我们希望能够搭建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值。
.NET Core使用SkiaSharp快速生成二维码( 真正跨平台方案)的更多相关文章
- C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求
C# 动态创建SQL数据库(二) 使用Entity Framework 创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...
- IOS开发技巧快速生成二维码
随着移动互联网的发展,二维码应用非常普遍,各大商场,饭店,水果店 基本都有二维码的身影,那么ios中怎么生成二维码呢? 下面的的程序演示了快速生成二维码的方法: 在ios里面要生成二维码,需要借助一个 ...
- java、python、golang等开发语言如何快速生成二维码?
免费二维码生成途径非常多!比如比较有名的草料二维码,如果只是简单的使用,用它就足够了.但是如果想大规模的生成,那就不太合适了.再者很多工具都没办法在二维码中加入logo(像微信二维码一样). 接下来, ...
- AJ学IOS 之二维码学习,快速生成二维码
AJ分享,必须精品 二维码是一项项目中可能会用到的,iOS打开相机索取二维码的速度可不是Android能比的...(Android扫描二维码要来回来回晃...) 简单不多说,如何把一段资料(网址呀,字 ...
- .net core里用ZXing生成二维码
先获取Nuget包 static void Main(string[] args) { string content = "二维码信息"; BitMatrix byteMatrix ...
- 在.net core web项目中生成二维码
1.添加QRCoder包引用 2. public IActionResult MakeQrCode() { string url="https://www.baidu.com& ...
- 使用Python第三方库生成二维码
本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...
- .net core 的图片处理及二维码的生成及解析
写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再 ...
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging ,给出的理由如下: System.Drawing命名空间对某些操作系统和应用程序类型有一些限制. 在Wind ...
- .net core 生成二维码
其实生成二维码的组件有很多种,如:QrcodeNet,ZKWeb.Fork.QRCoder,QRCoder等 我选QRCoder,是因为小而易用.支持大并发生成请求.不依赖任何库和网络服务. 既然是. ...
随机推荐
- 从零配置Webpack项目
webpack.config.js基本配置 webpack.config.js是webpack的配置文件,在此文件中对项目入口,项目的输出,loader,插件以及环境等进行简单的配置 首先来对webp ...
- 【小小Demo】网页视频通话小🌰子
工程名 video-call 一个简单的 音视频通话 demo,包含:视频.麦克风.屏幕共享操作. 项目环境 jdk1.8 idea maven springboot 2.1.1.RELEASE we ...
- kafka分区分配策略
前言 现有主流消息中间件都是生产者-消费者模型,主要角色都是:Producer -> Broker -> Consumer,上手起来非常简单,但仍有需要知识点需要我们关注,才能避免一些错误 ...
- YOLOv6在LabVIEW中的推理部署(含源码)
前言 YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用.如何使用python进行该模型的部署,官网已经介绍的很清楚了,但是对于如何在LabVIEW中实现该模型的部署,笔者目前还没有 ...
- 【译】如何在 Visual Studio 中调试异步代码
虽然异步代码可以提高程序的整体吞吐量,但异步代码仍然无法免除错误!当潜在的死锁.模糊的错误消息以及查找导致 Bug 的 Task 时,编写异步代码会使调试更加困难.幸运的是,Visual Studio ...
- golang技术降本增效的手段
最近一年各大中小厂都在搞"优化",说到优化,目的还是"降本增效",降低成本,增加效益(效率). 技术层面,也有一些降本增效的常规操作. 比如池化.io缓冲区技术 ...
- git: 解决每次操作git时都要输入账户、密码
解决方案 $ git config --global credential.helper store 使用该命令即可解决问题
- Burnside 定理
Burnside 定理 问题: 给定一个 \(n\) 个点,\(n\) 条边的环,有 \(m\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 \(10^9+7\) 取模 注意本题的本 ...
- 开源元数据管理平台Datahub最新版本0.10.5——安装部署手册(附离线安装包)
大家好,我是独孤风. 开源元数据管理平台Datahub近期得到了飞速的发展.已经更新到了0.10.5的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题.本文经过和群里大伙伴的共同讨论,总结出 ...
- idea 2021新窗口打开工程
描述 Mac M1,IDEA 2017 有部分兼容性问题,遂对IDEA进行升级 idea 升级2021(IntelliJ IDEA 2021.3 (Community Edition)) 打开新工程, ...