Anterior, când se dezvoltau proiecte ASP.NET folosind .NET Framework, toate erau implementate pe sisteme Windows și nu puteau fi cross-platform, așa că poți folosi System.Drawing pentru a genera coduri de verificare a imaginilor, după cum urmează:
Dezvoltarea online cu proiecte .NET Core, generarea captcha-urilor de imagine necesită referire la biblioteca System.Drawing.Common, dar deocamdatăPachetul System.Drawing.Common NuGet este acum grupat astfel:WindowsBiblioteci specifice。 Când se compila pentru sisteme de operare non-Windows, Platform Analyzer avertizează la compilare. Așa cum se vede în figura următoare:
Acest site de apel este accesibil pe toate platformele. "Fontul" este suportat doar pe "ferestre".
Înainte de .NET 6, utilizarea pachetului System.Drawing.Common nu genera niciun avertisment la compilare și nu arunca excepții la runtime. Începând cu .NET 6, Platform Analyzer emite un avertisment de compilare la compilarea codului de referință pentru sistemele de operare non-Windows. De asemenea, dacă opțiunea de configurare nu este setată, va fi aruncată următoarea excepție la runtime:
System.TypeInitializationException : Inițializatorul de tip pentru 'Gdip' a aruncat o excepție. ---- System.PlatformNotSupportedException : System.Drawing.Common nu este suportat pe platformele non-Windows. VedeaAutentificarea cu hyperlink este vizibilă.Pentru mai multe informații. Stivei: la System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(String filename, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): la System.Drawing.Bitmap.. ctor(Nume de fișier de șir, folosirea booleană) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): la System.Drawing.Bitmap.. ctor (Nume fișier String) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): la System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): la System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Trasele Inner Stack ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): la System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): la adresa System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): la System.Drawing.SafeNativeMethods.Gdip.. cctor() Referință de eroare:
Pentru procesarea imaginilor cross-platform, documentația oficială Microsoft recomandă utilizarea următoarelor biblioteci:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Referință:Autentificarea cu hyperlink este vizibilă.
Acest articol folosește biblioteca SkiaSharp pentru a genera CAPTCHA grafic,SkiaSharp este o API grafică 2D cross-platform pentru platforma .NET, bazată pe biblioteca grafică Skia (skia.org) a Google.。 Oferă un API 2D cuprinzător care poate fi folosit pe modele mobile, server și desktop pentru a randa imagini.
Adresă:Autentificarea cu hyperlink este vizibilă.
Mai întâi, creează un nou proiect ASP.NET Core 6 și o referințăSkiaSharpBibliotecile relevante sunt următoarele:
Rețineți că, dacă proiectul trebuie implementat pe un sistem Linux, sunt necesare referințeSkiaSharp.NativeAssets.LinuxClasă, altfel eroarea va fi următoarea:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: A apărut o excepție negestionată în timpul executării cererii. 03 apr 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Inițializatorul de tip pentru 'SkiaSharp.SKImageInfo' a aruncat o excepție. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Nu se poate încărca biblioteca partajată 'libSkiaSharp' sau una dintre dependențele acesteia. Pentru a ajuta la diagnosticarea problemelor de încărcare, luați în considerare setarea variabilei de mediu LD_DEBUG: liblibSkiaSharp: cannot open shared object file: No such file or directory Apr 03 18:51:06 raspberrypi dotnet[6203]: la SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 03 apr 18:51:06 raspberrypi dotnet[6203]: la SkiaSharp.SKImageInfo:. cctor() Apr 03 18:51:06 raspberrypi dotnet[6203]: --- Sfârșitul stivei interioare de excepții --- Apr 03 18:51:06 raspberrypi dotnet[6203]: la HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) în C: \Utilizatori\itsvse_pc\sursă\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:linia 184 Apr 03 18:51:06 raspberrypi dotnet[6203]: la HomeCloud.Controllers.HomeController.Test() în C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :linia 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: la lambda_method34(Închidere, Obiect, Obiect[] ) Pentru a lua în considerare că unele fonturi pot lipsi în alte sisteme, ceea ce duce la imposibilitatea de a afișa în mod normal informațiile codului de verificare, trebuie să copiem manual fonturile în proiect, să creăm un nou folder fonts în proiect și să copiem fonturile în acesta, așa cum se arată în figura de mai jos:
Configurația este următoarea:
Conform materialelor de referință de pe Internet, codul grafic de verificare generat de test este următorul:
CAPTCHA-ul generat are două dezavantaje:CAPTCHA-ul este complet negru (ușor de recunoscut prin OCR), iar literele CAPTCHA sunt înghesuite fără spațierePentru a rezolva aceste două probleme, am optimizat codul astfel:
Codul controlerului HomeController este următorul:
Randările finale sunt următoarele:
În final, atașează fișierul font:
Turiști, dacă vreți să vedeți conținutul ascuns al acestei postări, vă rog Răspunde
(Sfârșit)
|