Auparavant, lors du développement de ASP.NET projets utilisant le .NET Framework, ils étaient tous déployés sur des systèmes Windows, et ils ne pouvaient pas être multiplateformes, donc vous pouvez utiliser System.Drawing pour générer des codes de vérification d’image, comme suit :
Pour développer en ligne avec des projets .NET Core, générer des captchas d’image nécessite de se référer à la bibliothèque System.Drawing.Common, mais pour l’instantLe paquet NuGet System.Drawing.Common est désormais regroupé comme suit :WindowsBibliothèques spécifiques。 Lors de la compilation pour des systèmes d’exploitation non-Windows, le Platform Analyzer avertit au moment de la compilation. Comme le montre la figure suivante :
Ce site d’appel est accessible sur toutes les plateformes. « Police » n’est prise en charge que sur « fenêtres ».
Avant .NET 6, l’utilisation du paquet System.Drawing.Common ne générait aucun avertissement au moment de la compilation et n’affichait aucune exception à l’exécution. À partir de .NET 6, l’analyseur de plateforme émet un avertissement au moment de la compilation lors de la compilation du code de référence pour les systèmes d’exploitation non-Windows. De plus, à moins que l’option de configuration ne soit activée, l’exception d’exécution suivante sera lancée :
System.TypeInitializationException : L’initialiseur de type pour 'Gdip' a lancé une exception. ---- System.PlatformNotSupportedException : System.Drawing.Common n’est pas pris en charge sur les plateformes non-Windows. VoirLa connexion hyperlientérée est visible.Pour plus d’informations. Trace de la pile : sur System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(String filename, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0) : à System.Drawing.Bitmap.. ctor(Nom de fichier chaîne, booléen useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0) : à System.Drawing.Bitmap.. ctor(Nom de fichier chaîne) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0) : at System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0) : at System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Trace de pile intérieure ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0) : at System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0) : at System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0) : sur System.Drawing.SafeNativeMethods.Gdip.. cctor() Référence à l’erreur :
Pour le traitement d’image multiplateforme, la documentation officielle de Microsoft recommande d’utiliser les bibliothèques suivantes :
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Référence:La connexion hyperlientérée est visible.
Cet article utilise la bibliothèque SkiaSharp pour générer un CAPTCHA graphique,SkiaSharp est une API graphique 2D multiplateforme pour la plateforme .NET basée sur la bibliothèque graphique Skia (skia.org) de Google.。 Il propose une API 2D complète pouvant être utilisée sur mobile, serveur et bureau pour afficher des images.
Adresse:La connexion hyperlientérée est visible.
D’abord, créez un nouveau projet ASP.NET Core 6 et une référenceSkiaSharpLes bibliothèques concernées sont les suivantes :
Notez que si le projet doit être déployé sur un système Linux, des références sont requisesSkiaSharp.NativeAssets.Linuxclasse, sinon l’erreur sera la suivante :
03 avril 18:51:06 raspberrypi dotnet[6203] : faille : Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] 03 avr. 18:51:06 raspberrypi dotnet[6203] : Une exception non prise en charge s’est produite lors de l’exécution de la requête. 03 avril 18:51:06 raspberrypi dotnet[6203] : System.TypeInitializationException : L’initialiseur de type pour 'SkiaSharp.SKImageInfo' a lancé une exception. 03 avril 18:51:06 raspberrypi dotnet[6203] : ---> System.DllNotFoundException : Impossible de charger la bibliothèque partagée 'libSkiaSharp' ou l’une de ses dépendances. Pour aider à diagnostiquer les problèmes de chargement, envisagez de définir la variable d’environnement LD_DEBUG : liblibSkiaSharp : cannot open shared object file : No such file or directory 03 avril 18:51:06 raspberrypi dotnet[6203] : à SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 03 avril 18:51:06 raspberrypi dotnet[6203] : sur SkiaSharp.SKImageInfo :. cctor() 03 avr. 18:51:06 raspberrypi dotnet[6203] : --- Fin de la trace de la pile d’exception intérieure --- 03 avril 18:51:06 raspberrypi dotnet[6203] : sur HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) en C : \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs :ligne 184 03 avril 18:51:06 raspberrypi dotnet[6203] : sur HomeCloud.Controllers.HomeController.Test() dans C :\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :ligne 80 03 avr. 18:51:06 raspberrypi dotnet[6203] : à lambda_method34(Clôture, Objet, Objet[] ) Pour considérer que certaines polices de caractères peuvent manquer sous différents systèmes, ce qui empêche d’afficher normalement les informations du code de vérification, il faut copier manuellement les polices dans le projet, créer un nouveau dossier de polices dans le projet, puis y copier les polices, comme montré dans la figure ci-dessous :
La configuration est la suivante :
Selon les documents de référence sur Internet, le code de vérification graphique généré par le test est le suivant :
Le CAPTCHA généré présente deux inconvénients :Le CAPTCHA est entièrement noir (facilement reconnaissable par OCR), et les lettres CAPTCHA sont regroupées sans aucun espacementPour résoudre ces deux problèmes, j’ai optimisé le code comme suit :
Le code du contrôleur HomeController est le suivant :
Les rendus finaux sont les suivants :
Enfin, joignez le fichier de police :
Touristes, si vous voulez voir le contenu caché de ce post, s’il vous plaît Répondre
(Fin)
|