Eerder, bij het ontwikkelen van ASP.NET projecten met het .NET Framework, werden ze allemaal op Windows-systemen geïmplementeerd en konden ze niet cross-platform zijn, dus je kunt System.Drawing gebruiken om afbeeldingsverificatiecodes te genereren, als volgt:
Online ontwikkelen met .NET Core-projecten vereist het genereren van afbeeldingscaptcha's verwijzing naar de System.Drawing.Common-bibliotheek, maar voorlopigSystem.Drawing.Common NuGet-pakket is nu gegroepeerd als:RamenSpecifieke bibliotheken。 Bij compileren voor niet-Windows besturingssystemen waarschuwt de Platform Analyzer tijdens het compileren tijd. Zoals te zien is in de volgende figuur:
Deze belsite is op alle platforms toegankelijk. 'Lettertype' wordt alleen ondersteund op 'windows'.
Voor .NET 6 genereerde het gebruik van het System.Drawing.Common-pakket geen compile-tijdwaarschuwingen en werden er geen runtime-uitzonderingen gegooid. Vanaf .NET 6 geeft de Platform Analyzer een compileertijdwaarschuwing uit bij het compileren van referentiecode voor niet-Windows besturingssystemen. Ook, tenzij de configuratie-optie is ingesteld, zal de volgende runtime-uitzondering worden gegooid:
System.TypeInitializationException : De type-initializer voor 'Gdip' heeft een uitzondering gegooid. ---- System.PlatformNotSupportedException : System.Drawing.Common wordt niet ondersteund op niet-Windows-platforms. ZienDe hyperlink-login is zichtbaar.voor meer informatie. Stack Trace: op System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(String-bestandsnaam, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): op System.Drawing.Bitmap.. ctor(Bestandsnaam van string, Boolean useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): bij System.Drawing.Bitmap.. ctor(Bestandsnaam van string) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): bij System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): bij System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Inner Stack Trace ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): bij System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): bij System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): bij System.Drawing.SafeNativeMethods.Gdip.. cctor() Foutreferentie:
Voor cross-platform beeldverwerking raadt de officiële documentatie van Microsoft aan om de volgende bibliotheken te gebruiken:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Referentie:De hyperlink-login is zichtbaar.
Dit artikel gebruikt de SkiaSharp-bibliotheek om grafische CAPTCHA te genereren,SkiaSharp is een cross-platform 2D-grafische API voor het .NET-platform, gebaseerd op Google's Skia grafische bibliotheek (skia.org).。 Het biedt een uitgebreide 2D-API die gebruikt kan worden op mobiele, server- en desktopmodellen om afbeeldingen te renderen.
Adres:De hyperlink-login is zichtbaar.
Maak eerst een nieuw ASP.NET Core 6-project en referentie aanSkiaSharpDe relevante bibliotheken zijn als volgt:
Let op: als het project op een Linux-systeem moet worden geïmplementeerd, zijn referenties vereistSkiaSharp.NativeAssets.Linuxklasse, anders zal de fout als volgt zijn:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: Er is een niet-behandelde uitzondering opgetreden tijdens het uitvoeren van het verzoek. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: De type-initializer voor 'SkiaSharp.SKImageInfo' gaf een uitzondering. 03 april 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Gedeelde bibliotheek 'libSkiaSharp' of een van de afhankelijkheden ervan kan niet laden. Om laadproblemen te helpen diagnosticeren, overweeg de LD_DEBUG omgevingsvariabele in te stellen: libSkiaSharp: kan gedeeld objectbestand niet openen: Geen dergelijk bestand of map 03 apr 18:51:06 raspberrypi dotnet[6203]: op SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 03 apr 18:51:06 raspberrypi dotnet[6203]: bij SkiaSharp.SKImageInfo:. cctor() 03 april 18:51:06 raspberrypi dotnet[6203]: --- Einde van de inner exception stack trace --- Apr 03 18:51:06 raspberrypi dotnet[6203]: bij HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 breedte, Int32 hoogte, Int32 lineNum, Int32 lineStrookeWidth) in C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:regel 184 03 apr 18:51:06 raspberrypi dotnet[6203]: bij HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :regel 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Closure , Object , Object[] ) Om te overwegen dat sommige lettertypen onder verschillende systemen kunnen ontbreken, waardoor verificatiecode-informatie niet normaal kan worden weergegeven, moeten we de lettertypen handmatig kopiëren in het project, een nieuwe lettertypemap in het project aanmaken en de lettertypen daarin kopiëren, zoals te zien is in de onderstaande figuur:
De configuratie is als volgt:
Volgens de referentiematerialen op het internet is de grafische verificatiecode die door de test wordt gegenereerd als volgt:
De gegenereerde CAPTCHA heeft twee nadelen:De CAPTCHA is volledig zwart (gemakkelijk herkenbaar door OCR), en de CAPTCHA-letters staan dicht op elkaar gepropt zonder enige afstand.Om deze twee problemen op te lossen, heb ik de code als volgt geoptimaliseerd:
De HomeController-controllercode is als volgt:
De definitieve renderings zijn als volgt:
Voeg tenslotte het lettertypebestand bij:
Toeristen, als jullie de verborgen inhoud van dit bericht willen zien, alsjeblieft Antwoord
(Einde)
|