前言
在.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生成二维码的资料请关注代码网其它相关文章!
发表评论