Tidligere, når man utviklet ASP.NET prosjekter med .NET Framework, ble de alle distribuert på Windows-systemer, og de kunne ikke være plattformuavhengige, så du kan bruke System.Drawing til å generere bildeverifiseringskoder, som følger:
Ved å utvikle online med .NET Core-prosjekter krever generering av bildecaptchaer referanse til System.Drawing.Common-biblioteket, men foreløpigSystem.Drawing.Common NuGet-pakken er nå gruppert som:WindowsSpesifikke biblioteker。 Når man kompilerer for ikke-Windows-operativsystemer, advarer Platform Analyzer ved kompilering. Som vist i følgende figur:
Denne samtalesiden er tilgjengelig på alle plattformer. 'Font' støttes kun på 'windows'.
Før .NET 6 genererte bruken av System.Drawing.Common-pakken ingen kompilasjonstidsadvarsler og kastet ingen runtime-unntak. Fra og med .NET 6 gir Platform Analyzer en kompileringstidsadvarsel når referansekode for ikke-Windows-operativsystemer kompileres. I tillegg, med mindre konfigurasjonsvalget er satt, vil følgende runtime-unntak bli kastet:
System.TypeInitializationException: Typeinitializeren for 'Gdip' kastet et unntak. ---- System.PlatformNotSupportedException : System.Drawing.Common støttes ikke på ikke-Windows-plattformer. SeInnloggingen med hyperkoblingen er synlig.For mer informasjon. 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, boolsk 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() ----- Inner Stack Trace ----- /_/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() Feilreferanse:
For plattformuavhengig bildebehandling anbefaler Microsofts offisielle dokumentasjon bruk av følgende biblioteker:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Referanse:Innloggingen med hyperkoblingen er synlig.
Denne artikkelen bruker SkiaSharp-biblioteket for å generere grafisk CAPTCHA,SkiaSharp er et plattformuavhengig 2D-grafikk-API for .NET-plattformen basert på Googles Skia-grafikkbibliotek (skia.org).。 Den tilbyr et omfattende 2D-API som kan brukes på tvers av mobil-, server- og skrivebordsmodeller for å gjengi bilder.
Adresse:Innloggingen med hyperkoblingen er synlig.
Først, opprett et nytt ASP.NET Core 6-prosjekt og referanseSkiaSharpDe relevante bibliotekene er som følger:
Merk at hvis prosjektet må distribueres til et Linux-system, kreves referanserSkiaSharp.NativeAssets.Linuxklasse, ellers vil feilen 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]: Et ubehandlet unntak har oppstått under utførelsen av forespørselen. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Typeinitializeren for 'SkiaSharp.SKImageInfo' kastet et unntak. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Kan ikke laste delt bibliotek 'libSkiaSharp' eller en av dets avhengigheter. For å hjelpe med å diagnostisere lasteproblemer, vurder å sette LD_DEBUG miljøvariabelen: libSkiaSharp: kan ikke åpne delt objektfil: Ingen slik fil eller katalog 03. april 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]: --- Slutt på indre unntaksstack trace --- Apr 03 18:51:06 raspberrypi dotnet[6203]: på HomeCloud.ImageCaptcha.GetCaptcha(Streng captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) i C: \Users\itsvse_pc\source\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 å kunne ta hensyn til at noen fontfonter kan mangle i ulike systemer, noe som resulterer i manglende evne til å vise verifiseringskodeinformasjon normalt, må vi manuelt kopiere fontene inn i prosjektet, opprette en ny fontmappe i prosjektet, og kopiere fontene inn i den, som vist i figuren nedenfor:
Konfigurasjonen er som følger:
Ifølge referansematerialet på Internett er den grafiske verifiseringskoden som genereres av testen som følger:
Den genererte CAPTCHA har to ulemper:CAPTCHA er helt svart (lett gjenkjennelig av OCR), og CAPTCHA-bokstavene er tett sammen uten mellomromFor å løse disse to problemene optimaliserte jeg koden slik:
HomeController-kontrollerkoden er som følger:
De endelige gjengivelsene er som følger:
Til slutt, legg ved fontfilen:
Turister, hvis dere vil se det skjulte innholdet i dette innlegget, vær så snill Svare
(Slutt)
|