Tidigare, när man utvecklade ASP.NET projekt med .NET Framework, distribuerades de alla på Windows-system och de kunde inte vara plattformsoberoende, så du kan använda System.Drawing för att generera bildverifieringskoder, enligt följande:
Att utveckla online med .NET Core-projekt kräver bildkaptcha referens till System.Drawing.Common-biblioteket, men för tillfället krävs det referens till System.Drawing.Common-biblioteketSystem.Drawing.Common NuGet-paketet är nu grupperat som:WindowsSpecifika bibliotek。 Vid kompilering för icke-Windows-operativsystem varnar Platform Analyzer vid kompileringstillfället. Som visas i följande figur:
Denna samtalssida är tillgänglig på alla plattformar. 'Font' stöds endast på 'windows'.
Före .NET 6 genererade användningen av System.Drawing.Common-paketet inga kompileringsvarningar och gav inga runtime-undantag. Från och med .NET 6 ger Platform Analyzer en kompileringsvarning vid kompilering av referenskod för icke-Windows-operativsystem. Dessutom, om inte konfigurationsalternativet är satt, kommer följande runtime-undantag att kastas:
System.TypeInitializationException: Typinitialiseraren för 'Gdip' gav ett undantag. ---- System.PlatformNotSupportedException : System.Drawing.Common stöds inte på plattformar utanför Windows. SeInloggningen med hyperlänken är synlig.för mer information. Stackspårning: på System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Strängfilnamn, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): på System.Drawing.Bitmap.. ctor(Strängfilnamn, boolesk useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): på System.Drawing.Bitmap.. ctor(Strängfilnamn) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): på System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): på System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- inre stackspårning ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): på System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): på System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): på System.Drawing.SafeNativeMethods.Gdip.. cctor() Felreferens:
För plattformsoberoende bildbehandling rekommenderar Microsofts officiella dokumentation att använda följande bibliotek:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Hänvisning:Inloggningen med hyperlänken är synlig.
Den här artikeln använder SkiaSharp-biblioteket för att generera grafisk CAPTCHA,SkiaSharp är ett plattformsoberoende 2D-grafik-API för .NET-plattformen baserat på Googles Skia-grafikbibliotek (skia.org).。 Det erbjuder ett omfattande 2D-API som kan användas över mobila, server- och skrivbordsmodeller för att rendera bilder.
Adress:Inloggningen med hyperlänken är synlig.
Först, skapa ett nytt ASP.NET Core 6-projekt och referensSkiaSharpDe relevanta biblioteken är följande:
Observera att om projektet behöver distribueras till ett Linux-system krävs referenserSkiaSharp.NativeAssets.Linuxklass, annars kommer felet att vara följande:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: Ett ohanterat undantag har inträffat vid exekveringen av förfrågan. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Typinitialiseraren för 'SkiaSharp.SKImageInfo' gav ett undantag. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Kan inte ladda det delade biblioteket 'libSkiaSharp' eller någon av dess beroenden. För att hjälpa till att diagnostisera laddningsproblem bör du överväga att ställa in LD_DEBUG miljövariabeln: libSkiaSharp: kan inte öppna delad objektfil: Ingen sådan fil eller katalog 03 apr 18:51:06 raspberrypi dotnet[6203]: på SkiaSharp.SkiaApi.sk_colortype_get_default_8888() Apr 03 18:51:06 raspberrypi dotnet[6203]: på SkiaSharp.SKImageInfo:. cctor() Apr 03 18:51:06 raspberrypi dotnet[6203]: --- Slut på inre undantagsstackspår --- Apr 03 18:51:06 raspberrypi dotnet[6203]: på HomeCloud.ImageCaptcha.GetCaptcha(Sträng captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) i C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:rad 184 Apr 03 18:51:06 raspberrypi dotnet[6203]: på HomeCloud.Controllers.HomeController.Test() i C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :rad 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: vid lambda_method34(Closure , Object , Object[] ) För att kunna betrakta att vissa typsnitt kan saknas i olika system, vilket leder till att verifieringskodsinformation inte kan visas normalt, behöver vi manuellt kopiera typsnitten till projektet, skapa en ny typsnittsmapp i projektet och kopiera typsnitten dit, som visas i figuren nedan:
Konfigurationen är följande:
Enligt referensmaterialet på internet är den grafiska verifieringskoden som genereras av testet följande:
Den genererade CAPTCHA har två nackdelar:CAPTCHA är helt svart (lätt igenkännbar av OCR), och CAPTCHA-bokstäverna är trängda tillsammans utan något avståndFör att lösa dessa två problem optimerade jag koden enligt följande:
HomeController-kontrollerkoden är följande:
De slutliga renderingarna är följande:
Slutligen, bifoga typsnittsfilen:
Turister, om ni vill se det dolda innehållet i detta inlägg, snälla Svar
(Slut)
|