.NET?Core使用SkiaSharp實(shí)現(xiàn)快速生成二維碼
前言
在.NET 6之前我們一直是使用QRCoder來生成二維碼(QRCoder是一個(gè)非常強(qiáng)大的生成二維碼的組件,用到了System.Drawing.Common 包),然后從.NET 6開始,當(dāng)為非 Windows 操作系統(tǒng)編譯引用代碼時(shí),平臺(tái)分析器會(huì)發(fā)出編譯時(shí)警告。異常如下:
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()
報(bào)錯(cuò)原因
由于 System.Drawing.Common 被設(shè)計(jì)為 Windows 技術(shù)的精簡(jiǎn)包裝器,因此其跨平臺(tái)實(shí)現(xiàn)欠佳。
libgdiplus 是本機(jī)端 System.Drawing.Common 跨平臺(tái)實(shí)現(xiàn)的主要提供程序。libgdiplus 實(shí)際上是對(duì) System.Drawing.Common 所依賴的 Windows 部分的重新實(shí)現(xiàn)。該實(shí)現(xiàn)使 libgdiplus 成為一個(gè)重要的組件。它大約有 30,000 行 C 代碼,大部分未經(jīng)測(cè)試,而且缺少很多功能。libgdiplus 還具有許多用于圖像處理和文本呈現(xiàn)的外部依賴項(xiàng),例如 cairo、pango 和其他本機(jī)庫。這些依賴項(xiàng)使得維護(hù)和交付組件更具挑戰(zhàn)性。自從包含 Mono 跨平臺(tái)實(shí)現(xiàn)以來,我們已將許多從未得到修復(fù)的問題重定向到 libgdiplus。相比之下,我們采用的其他外部依賴項(xiàng),例如 icu 或 openssl,都是高質(zhì)量的庫。使 libgdiplus 的功能集和質(zhì)量與 .NET 堆棧的其余部分相媲美是不可行的。
官方建議
在非 Windows 環(huán)境中,推薦使用 SkiaSharp 和 ImageSharp 等庫來完成跨平臺(tái)的圖像處理操作。這些庫提供了更全面和穩(wěn)定的功能支持,適用于大多數(shù)圖形操作需求。而 System.Drawing.Common 將主要繼續(xù)在 Windows 窗體和 GDI+ 的上下文中進(jìn)行演化。
SkiaSharp介紹
SkiaSharp是由Mono團(tuán)隊(duì)維護(hù)的開源項(xiàng)目,它是基于Google的Skia圖形庫的.NET跨平臺(tái)綁定,提供了強(qiáng)大的2D圖形繪制和處理功能,適用于多個(gè)平臺(tái),包括Windows、macOS、Linux、iOS和Android,可用于創(chuàng)建高性能的、可移植的2D圖形應(yīng)用程序。
SkiaSharp 提供了跨平臺(tái)綁定,適用于以下平臺(tái):
- .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)
這些平臺(tái)可以使用 SkiaSharp 來進(jìn)行跨平臺(tái)的圖形渲染和繪制操作。
使用SkiaSharp快速生成二維碼
1、安裝SkiaSharp.QrCode庫
使用SkiaSharp生成二維碼的QR碼生成器(無需使用System.Drawing)。

2、生成二維碼圖片
/// <summary>
/// 生成二維碼圖片
/// </summary>
public static void GenerateQRCode()
{
var qrCodeContent = "追逐時(shí)光者";
using (var generator = new QRCodeGenerator())
{
// 創(chuàng)建二維碼(并設(shè)置糾錯(cuò)能力最高級(jí))
var createQrCode = generator.CreateQrCode(qrCodeContent, ECCLevel.H);
var skImageInfo = new SKImageInfo(300, 300);
// 創(chuàng)建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格式的數(shù)據(jù)
using (var stream = File.OpenWrite(@"MyQRCode.png"))
{
data.SaveTo(stream);// 將數(shù)據(jù)保存到文件流中,生成二維碼圖片
}
}
}
}二維碼的糾錯(cuò)能力通常分為四個(gè)級(jí)別
在生成二維碼時(shí),糾錯(cuò)能力(Error Correction Capability)指的是QR碼中包含的冗余信息,用于修復(fù)可能出現(xiàn)的損壞或錯(cuò)誤。QR碼可以通過添加冗余信息來提高其容錯(cuò)性,即使在一定程度上受到損壞或噪聲的干擾,仍然可以正確地解碼和還原二維碼的內(nèi)容。
QR碼的糾錯(cuò)能力通常分為四個(gè)級(jí)別,從低到高依次為:L、M、Q、H。其中,糾錯(cuò)能力最低的級(jí)別為L(zhǎng),最高的級(jí)別為H。糾錯(cuò)能力越高,二維碼中包含的冗余信息就越多,因此可以更好地恢復(fù)丟失或損壞的數(shù)據(jù)。
namespace SkiaSharp.QrCode
{
public enum ECCLevel
{
L,
M,
Q,
H
}
}以上就是.NET Core使用SkiaSharp實(shí)現(xiàn)快速生成二維碼的詳細(xì)內(nèi)容,更多關(guān)于.NET SkiaSharp生成二維碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ASP.NET中將聲音文件添加到資源中并進(jìn)行播放的方法
這篇文章主要介紹了ASP.NET中將聲音文件添加到資源中并進(jìn)行播放的方法,實(shí)例分析了聲音文件的添加及播放實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
ASp.net 文本框(TextBox)計(jì)算,判斷輸入的是否是數(shù)字
ASp.net文本計(jì)算,文本框數(shù)字輸入檢測(cè),文本框的TextChanged事件,同時(shí)在屬性的Auto Post Back設(shè)置為True2009-07-07
Prism區(qū)域管理器IRegionManager用法介紹
這篇文章介紹了Prism區(qū)域管理器IRegionManager用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
ASP.NET Core 過濾器中使用依賴注入知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于ASP.NET Core 過濾器中使用依賴注入的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-10-10
詳解ASP.NET MVC 解析模板生成靜態(tài)頁(RazorEngine)
我們?cè)诤芏囗?xiàng)目開發(fā)中會(huì)常常用到頁面靜態(tài)化,本篇文章主要介紹了詳解ASP.NET MVC 解析模板生成靜態(tài)頁(RazorEngine) ,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03
.net?6項(xiàng)目實(shí)現(xiàn)壓縮發(fā)布
這篇文章介紹了.net?6項(xiàng)目實(shí)現(xiàn)壓縮發(fā)布的方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
asp.net實(shí)現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法,涉及asp.net操作office文件的相關(guān)技巧,需要的朋友可以參考下2016-08-08

