Predtým, pri vývoji ASP.NET projektov s použitím .NET Frameworku, boli všetky nasadené na Windows systémoch a nemohli byť multiplatformové, takže môžete použiť System.Drawing na generovanie kódov na overenie obrázkov, nasledovne:
Pri online vývoji s projektmi .NET Core je generovanie obrazových captcha potrebné odkazovať na knižnicu System.Drawing.Common, ale zatiaľBalík System.Drawing.Common NuGet je teraz zoskupený ako:WindowsKonkrétne knižnice。 Pri kompilácii pre ne-Windows operačné systémy Platform Analyzer varuje pri kompilácii. Ako je znázornené na nasledujúcom obrázku:
Táto volajúca stránka je prístupná na všetkých platformách. 'Font' je podporovaný iba na 'windows'.
Pred .NET 6 používanie balíka System.Drawing.Common negenerovalo žiadne varovania počas kompilácie a nevyhodilo žiadne výnimky za behu. Od .NET 6 Platform Analyzer vydáva varovanie pri kompilácii referenčného kódu pre operačné systémy mimo Windows. Tiež, pokiaľ nie je nastavená konfiguračná možnosť, bude vyhodená nasledujúca výnimka za behu:
System.TypeInitializationException : Typový inicializátor pre 'Gdip' vyhodil výnimku. ---- System.PlatformNotSupportedException : System.Drawing.Common nie je podporovaný na platformách mimo Windows. VidieťPrihlásenie na hypertextový odkaz je viditeľné.Pre viac informácií. Stack Trace: at System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(názov súboru reťazca, IntPtr& bitmapa) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): na System.Drawing.Bitmap.. ctor(názov súboru reťazca, Boolean useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): na System.Drawing.Bitmap.. ctor(názov súboru reťazca) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): na System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): na System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Inner Stack Trace ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): na System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): na System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): na System.Drawing.SafeNativeMethods.Gdip.. cctor() Referencia na chybu:
Pre multiplatformové spracovanie obrázkov oficiálna dokumentácia Microsoftu odporúča používať nasledujúce knižnice:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Referencia:Prihlásenie na hypertextový odkaz je viditeľné.
Tento článok používa knižnicu SkiaSharp na generovanie grafického CAPTCHA,SkiaSharp je multiplatformové 2D grafické API pre platformu .NET založené na grafickej knižnici Google Skia (skia.org).。 Ponúka komplexné 2D API, ktoré je možné používať na mobilných, serverových aj desktopových modeloch na renderovanie obrázkov.
Adresa:Prihlásenie na hypertextový odkaz je viditeľné.
Najprv vytvorte nový projekt ASP.NET Core 6 a referenciuSkiaSharpPríslušné knižnice sú nasledovné:
Upozorňujeme, že ak je potrebné projekt nasadiť na Linux systém, sú potrebné referencieSkiaSharp.NativeAssets.Linuxtriedy, inak bude chyba nasledovná:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: Pri vykonávaní požiadavky došlo k nespracovanej výnimke. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Typový inicializátor pre 'SkiaSharp.SKImageInfo' vyhodil výnimku. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Nie je možné načítať zdieľanú knižnicu 'libSkiaSharp' alebo jednu z jej závislostí. Aby ste pomohli diagnostikovať problémy s načítaním, zvážte nastavenie LD_DEBUG environmentálnej premennej: liblibSkiaSharp: cannot open shared object file: Žiadny takýto súbor ani adresár Apr 03 18:51:06 raspberrypi dotnet[6203]: at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() Apr 03 18:51:06 raspberrypi dotnet[6203]: na SkiaSharp.SKImageInfo:. cctor() Apr 03 18:51:06 raspberrypi dotnet[6203]: --- Koniec inner exception stack trace --- Apr 03 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) v C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:line 184 Apr 03 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :riadok 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Closure , Object , Object[] ) Aby sme zohľadnili, že niektoré fonty môžu chýbať v rôznych systémoch, čo vedie k bežnému zobrazovaniu informácií o overovacích kódoch, musíme fonty manuálne skopírovať do projektu, vytvoriť nový priečinok fontov v projekte a skopírovať fonty do neho, ako je znázornené na obrázku nižšie:
Konfigurácia je nasledovná:
Podľa referenčných materiálov na internete je grafický overovací kód generovaný testom nasledovný:
Generovaná CAPTCHA má dve nevýhody:CAPTCHA je úplne čierny (ľahko rozpoznateľný OCR) a písmená CAPTCHA sú natlačené bez akýchkoľvek medzierAby som vyriešil tieto dva problémy, optimalizoval som kód nasledovne:
Kód ovládača HomeController je nasledovný:
Konečné zobrazenia sú nasledovné:
Nakoniec priložte súbor písma:
Turisti, ak chcete vidieť skrytý obsah tohto príspevku, prosím. Odpoveď
(Koniec)
|