Tidligere, når ASP.NET projekter udvikles med .NET Framework, blev de alle implementeret på Windows-systemer, og de kunne ikke være platformoverskridende, så du kan bruge System.Drawing til at generere billedverifikationskoder, som følger:
Udvikling online med .NET Core-projekter og generering af billedcaptchaer kræver reference til System.Drawing.Common-biblioteket, men for nuSystem.Drawing.Common NuGet-pakken er nu grupperet som:WindowsSpecifikke biblioteker。 Når man kompilerer til ikke-Windows operativsystemer, advarer Platform Analyzer ved kompilering. Som vist i følgende figur:
Denne opkaldsside er tilgængelig på alle platforme. 'Font' understøttes kun på 'windows'.
Før .NET 6 genererede brugen af System.Drawing.Common-pakken ingen compile-time advarsler og kastede ingen runtime-undtagelser. Fra og med .NET 6 udsender Platform Analyzer en kompileringstidsadvarsel, når referencekode kompileres til ikke-Windows-operativsystemer. Desuden, medmindre konfigurationsmuligheden er sat, vil følgende runtime-undtagelse blive kastet:
System.TypeInitializationException : Typeinitializeren for 'Gdip' kastede en undtagelse. ---- System.PlatformNotSupportedException : System.Drawing.Common understøttes ikke på ikke-Windows-platforme. SeHyperlink-login er synlig.For mere information. Stack Trace: på System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Strengfilnavn, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): på System.Drawing.Bitmap.. ctor(Strengfilnavn, boolesk useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): på System.Drawing.Bitmap.. ctor(Strengfilnavn) /_/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() ----- Indre Stakspor ----- /_/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() Fejlreference:
For tværplatformsbaseret billedbehandling anbefaler Microsofts officielle dokumentation brugen af følgende biblioteker:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Henvisning:Hyperlink-login er synlig.
Denne artikel bruger SkiaSharp-biblioteket til at generere grafisk CAPTCHA,SkiaSharp er et cross-platform 2D grafik-API til .NET-platformen baseret på Googles Skia grafikbibliotek (skia.org).。 Den tilbyder et omfattende 2D-API, der kan bruges på tværs af mobile, server- og desktopmodeller til at gengive billeder.
Adresse:Hyperlink-login er synlig.
Først skal du oprette et nyt ASP.NET Core 6-projekt og referenceSkiaSharpDe relevante biblioteker er som følger:
Bemærk, at hvis projektet skal implementeres på et Linux-system, kræves referencerSkiaSharp.NativeAssets.Linuxklasse, ellers vil fejlen være som følger:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: En uhåndteret undtagelse er opstået under udførelsen af forespørgslen. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Typeinitializeren for 'SkiaSharp.SKImageInfo' kastede en undtagelse. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Kan ikke indlæse det delte bibliotek 'libSkiaSharp' eller en af dets afhængigheder. For at hjælpe med at diagnosticere indlæsningsproblemer, overvej at sætte LD_DEBUG miljøvariabelen: libSkiaSharp: kan ikke åbne delt objektfil: Ingen sådan fil eller mappe 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å indre undtagelsesstak trace --- Apr 03 18:51:06 raspberrypi dotnet[6203]: hos HomeCloud.ImageCaptcha.GetCaptcha(Streng captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) i C: \Brugere\itsvse_pc\kilde\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:linje 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 :linje 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Closure , Object , Object[] ) For at kunne overveje, at nogle skrifttypetyper kan mangle under forskellige systemer, hvilket resulterer i manglende evne til normalt at vise verifikationskodeinformation, skal vi manuelt kopiere skrifttyperne ind i projektet, oprette en ny skrifttypemappe i projektet og kopiere skrifttyperne ind i den, som vist i figuren nedenfor:
Konfigurationen er som følger:
Ifølge referencematerialet på internettet er den grafiske verifikationskode, der genereres af testen, som følger:
Den genererede CAPTCHA har to ulemper:CAPTCHA er helt sort (let genkendt af OCR), og CAPTCHA-bogstaverne er presset sammen uden nogen afstandFor at løse disse to problemer optimerede jeg koden således:
HomeController-controllerkoden er som følger:
De endelige gengivelser er som følger:
Endelig vedhæfter du skrifttypefilen:
Turister, hvis I vil se det skjulte indhold i dette indlæg, så vær venlig Svar
(Slut)
|