Dříve, při vývoji ASP.NET projektů s využitím .NET Frameworku, byly všechny nasazeny na systémech Windows a nemohly být multiplatformní, takže můžete použít System.Drawing k generování kódů pro ověřování obrázků, a to následovně:
Při online vývoji s projekty .NET Core je generování obrazových captcha potřeba odkazovat na knihovnu System.Drawing.Common, ale zatímBalíček System.Drawing.Common NuGet je nyní seskupen jako:WindowsSpecifické knihovny。 Při kompilaci pro operační systémy mimo Windows Platform Analyzer varuje při kompilaci. Jak je znázorněno na následujícím obrázku:
Tato stránka pro volání je přístupná na všech platformách. 'Font' je podporován pouze na 'Windows'.
Před .NET 6 nebylo používání balíčku System.Drawing.Common generováno žádné varování při kompilaci a nezobrazovalo žádné výjimky za běhu. Od .NET 6 vydává Platform Analyzer varování při kompilaci referenčního kódu pro operační systémy mimo Windows. Také, pokud není nastavena konfigurační volba, bude vyhozena následující výjimka za běhu:
System.TypeInitializationException : Typový inicializátor pro 'Gdip' vyhodil výjimku. ---- System.PlatformNotSupportedException : System.Drawing.Common není podporován na platformách mimo Windows. VidětPřihlášení k hypertextovému odkazu je viditelné.pro více informací. Stack Trace: na System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Název souboru řetězce, IntPtr& bitmapa) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): na System.Drawing.Bitmap.. ctor(název souboru řetězce, Boolean useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): na System.Drawing.Bitmap.. ctor(název souboru řetězce) /_/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() ----- Vnitřní stopa ----- /_/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() Odkaz na chybu:
Pro zpracování obrazu napříč platformami doporučuje oficiální dokumentace Microsoftu používat následující knihovny:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Odkaz:Přihlášení k hypertextovému odkazu je viditelné.
Tento článek využívá knihovnu SkiaSharp k generování grafického CAPTCHA,SkiaSharp je multiplatformní 2D grafické API pro platformu .NET založené na grafické knihovně Google Skia (skia.org).。 Nabízí komplexní 2D API, které lze používat napříč mobilními, serverovými i desktopovými modely pro vykreslování obrázků.
Adresa:Přihlášení k hypertextovému odkazu je viditelné.
Nejprve vytvořte nový projekt ASP.NET Core 6 a odkazSkiaSharpPříslušné knihovny jsou následující:
Všimněte si, že pokud je potřeba projekt nasadit na linuxový systém, jsou vyžadovány referenceSkiaSharp.NativeAssets.Linuxtřídy, jinak bude chyba následující:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] 3. dubna 18:51:06 raspberrypi dotnet[6203]: Při vykonávání požadavku došlo k nezpracované výjimě. Dubna 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Typový inicializátor pro 'SkiaSharp.SKImageInfo' vyhodil výjimku. 3. dubna 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Nelze načíst sdílenou knihovnu 'libSkiaSharp' ani jednu z jejích závislostí. Pro lepší diagnostiku problémů s načítáním zvažte nastavení proměnné LD_DEBUG prostředí: liblibSkiaSharp: nelze otevřít soubor sdíleného objektu: Žádný takový soubor ani adresář 3. dubna 18:51:06 raspberrypi dotnet[6203]: at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 3. dubna 18:51:06 raspberrypi dotnet[6203]: na SkiaSharp.SKImageInfo:. cctor() Dubna 03 18:51:06 raspberrypi dotnet[6203]: --- Konec 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 3. dubna 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :line 80 Dubna 03 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Closure , objekt , objekt[] ) Abychom mohli zohlednit, že některá fonta mohou chybět v různých systémech, což vede k normálnímu zobrazení informací o ověřovacích kódech, musíme fonty ručně zkopírovat do projektu, vytvořit novou složku fontů v projektu a zkopírovat do ní fonty, jak je znázorněno na obrázku níže:
Konfigurace je následující:
Podle referenčních materiálů na internetu je grafický ověřovací kód generovaný testem následující:
Generovaná CAPTCHA má dvě nevýhody:CAPTCHA je celá černá (snadno rozpoznatelná OCR) a písmena CAPTCHA jsou natěsnaná dohromady bez jakéhokoliv mezerAbych tyto dva problémy vyřešil, optimalizoval jsem kód následovně:
Kód ovladače HomeController je následující:
Konečné ztvárnění jsou následující:
Nakonec přiložte soubor písma:
Turisté, pokud chcete vidět skrytý obsah tohoto příspěvku, prosím Odpověď
(Konec)
|