In precedenza, durante lo sviluppo di ASP.NET progetti usando il .NET Framework, venivano tutti distribuiti su sistemi Windows e non potevano essere multipiattaforma, quindi si può usare System.Drawing per generare codici di verifica delle immagini, come segue:
Sviluppando online con progetti .NET Core, generare captcha di immagini richiede riferimento alla libreria System.Drawing.Common, ma per oraIl pacchetto System.Drawing.Common NuGet è ora raggruppato come:FinestreBiblioteche specifiche。 Quando si compila per sistemi operativi non Windows, il Platform Analyzer avvisa al momento della compilazione. Come mostrato nella figura seguente:
Questo sito di chiamata è accessibile su tutte le piattaforme. 'Font' è supportato solo su 'windows'.
Prima di .NET 6, l'uso del pacchetto System.Drawing.Common non generava alcun avviso in tempo di compilazione e non veniva rilasciata eccezioni a runtime. A partire da .NET 6, il Platform Analyzer emette un avviso di compilazione durante la compilazione di codice di riferimento per sistemi operativi non Windows. Inoltre, a meno che l'opzione di configurazione non sia impostata, verrà lanciata la seguente eccezione runtime:
System.TypeInitializationException : L'inizializzatore di tipo per 'Gdip' ha lanciato un'eccezione. ---- System.PlatformNotSupportedException : System.Drawing.Common non è supportato su piattaforme non Windows. VedereIl login del link ipertestuale è visibile.Per maggiori informazioni. Traccia dello stack: su System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Stringname file, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): su System.Drawing.Bitmap.. ctor(Nome file stringa, uso booleano) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): su System.Drawing.Bitmap.. ctor(Nome file stringa) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): su System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): at System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Traccia dello stack interno ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): su System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): su System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): su System.Drawing.SafeNativeMethods.Gdip.. cctor() Riferimento all'errore:
Per l'elaborazione immagini multipiattaforma, la documentazione ufficiale di Microsoft raccomanda di utilizzare le seguenti librerie:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Riferimento:Il login del link ipertestuale è visibile.
Questo articolo utilizza la libreria SkiaSharp per generare CAPTCHA grafico,SkiaSharp è un'API grafica 2D multipiattaforma per la piattaforma .NET basata sulla libreria grafica Skia (skia.org) di Google.。 Offre un'API 2D completa che può essere utilizzata su modelli mobili, server e desktop per renderizzare immagini.
Indirizzo:Il login del link ipertestuale è visibile.
Per prima cosa, crea un nuovo progetto e riferimento ASP.NET Core 6SkiaSharpLe biblioteche rilevanti sono le seguenti:
Si noti che se il progetto deve essere distribuito su un sistema Linux, sono necessarie delle referenzeSkiaSharp.NativeAssets.Linuxclasse, altrimenti l'errore sarà il seguente:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: Si è verificata un'eccezione non gestita durante l'esecuzione della richiesta. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: L'inizializzatore di tipo per 'SkiaSharp.SKImageInfo' ha lanciato un'eccezione. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Impossibile caricare la libreria condivisa 'libSkiaSharp' o una delle sue dipendenze. Per aiutare a diagnosticare i problemi di caricamento, considera di impostare la variabile di ambiente LD_DEBUG: liblibSkiaSharp: cannot open shared object file: No such file or directory Apr 03 18:51:06 raspberrypi dotnet[6203]: a SkiaSharp.SkiaApi.sk_colortype_get_default_8888() Apr 03 18:51:06 raspberrypi dotnet[6203]: su SkiaSharp.SKImageInfo:. cctor() 03 apr 18:51:06 raspberrypi dotnet[6203]: --- Fine della traccia dello stack di eccezioni interne --- Apr 03 18:51:06 raspberrypi dotnet[6203]: su HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) in C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:line 184 Apr 03 18:51:06 raspberrypi dotnet[6203]: su HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :linea 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: a lambda_method34(Chiusura , Oggetto, Oggetto[] ) Per considerare che alcuni font potrebbero mancare in sistemi diversi, con il risultato che non è possibile visualizzare normalmente le informazioni del codice di verifica, dobbiamo copiare manualmente i font nel progetto, creare una nuova cartella fonts nel progetto e copiarvi i font, come mostrato nella figura sottostante:
La configurazione è la seguente:
Secondo i materiali di riferimento su Internet, il codice grafico di verifica generato dal test è il seguente:
Il CAPTCHA generato presenta due svantaggi:Il CAPTCHA è tutto nero (facilmente riconoscibile dall'OCR), e le lettere CAPTCHA sono ammassate senza spaziaturaPer risolvere questi due problemi, ho ottimizzato il codice come segue:
Il codice del controller HomeController è il seguente:
Le rappresentazioni finali sono le seguenti:
Infine, allega il file font:
Turisti, se volete vedere il contenuto nascosto di questo post, vi prego Risposta
(Fine)
|