Wcześniej, podczas tworzenia ASP.NET projektów w .NET Framework, wszystkie były wdrażane na systemach Windows i nie mogły być wieloplatformowe, więc można używać System.Drawing do generowania kodów weryfikacyjnych obrazów, w następujący sposób:
Tworzenie online z użyciem projektów .NET Core, generowanie captcha obrazów wymaga odwołania się do biblioteki System.Drawing.Common, ale na razieSystem.Drawing.Common NuGet jest teraz grupowany jako:WindowsKonkretne biblioteki。 Podczas kompilacji dla systemów operacyjnych innych niż Windows, Platform Analyzer ostrzega podczas kompilacji. Jak pokazano na poniższym rysunku:
Ta strona telefoniczna jest dostępna na wszystkich platformach. 'Font' jest obsługiwany tylko na 'Windows'.
Przed .NET 6 użycie pakietu System.Drawing.Common nie generowało żadnych ostrzeżeń w czasie kompilacji ani nie wyrzucało wyjątków w czasie wykonywania. Począwszy od .NET 6, Platform Analyzer wydaje ostrzeżenie o czasie kompilacji podczas kompilacji kodu referencyjnego dla systemów operacyjnych innych niż Windows. Ponadto, jeśli opcja konfiguracji nie jest ustawiona, zostanie wyrzucony następujący wyjątek w czasie działania:
System.TypeInitializationException : Inicjalizator typu dla 'Gdip' wygenerował wyjątek. ---- System.PlatformNotSupportedException : System.Drawing.Common nie jest obsługiwany na platformach innych niż Windows. WidziećLogowanie do linku jest widoczne.Więcej informacji. Stack Trace: na stronie System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Nazwa pliku ciągu ciągów, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): na stronie System.Drawing.Bitmap.. ctor(String filename, boolean useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): na stronie System.Drawing.Bitmap.. ctor(nazwa pliku string) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): na stronie System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): at System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Inner Stack Trace ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): na stronie System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): na stronie System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): na stronie System.Drawing.SafeNativeMethods.Gdip.. cctor() Odwołanie do błędu:
Do przetwarzania obrazów wieloplatformowych oficjalna dokumentacja Microsoftu zaleca korzystanie z następujących bibliotek:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Odniesienie:Logowanie do linku jest widoczne.
Ten artykuł wykorzystuje bibliotekę SkiaSharp do generowania graficznego CAPTCHA,SkiaSharp to wieloplatformowe API grafiki 2D dla platformy .NET oparte na bibliotece graficznej Google Skia (skia.org).。 Oferuje kompleksowe 2D API, które można używać na modelach mobilnych, serwerowych i desktopowych do renderowania obrazów.
Adres:Logowanie do linku jest widoczne.
Najpierw stwórz nowy projekt ASP.NET Core 6 i odnośnikSkiaSharpOdpowiednie biblioteki to:
Należy zauważyć, że jeśli projekt musi zostać wdrożony na systemie Linux, wymagane są odwołaniaSkiaSharp.NativeAssets.Linuxklasa, w przeciwnym razie błąd będzie następujący:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Kwi 03 18:51:06 raspberrypi dotnet[6203]: Podczas wykonywania żądania wystąpił nieobsłużony wyjątek. Kwi 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Inicjalizator typu dla 'SkiaSharp.SKImageInfo' wyrzucił wyjątek. Kwi 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Nie można załadować współdzielonej biblioteki 'libSkiaSharp' ani jednej z jej zależności. Aby pomóc w diagnozowaniu problemów z ładowaniem, rozważ ustawienie zmiennej środowiskowej LD_DEBUG: liblibSkiaSharp: cannot open shared object file: Brak takiego pliku ani katalogu 03 kwietnia 18:51:06 raspberrypi dotnet[6203]: at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 03 kwietnia 18:51:06 raspberrypi dotnet[6203]: at SkiaSharp.SKImageInfo:. cctor() Kwi 03 18:51:06 raspberrypi dotnet[6203]: --- Koniec wewnętrznego śledzenia wyjątków stosu --- Apr 03 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) w języku C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:linia 184 03 kwietnia 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :linia 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Closure , Object , Object[] ) Aby rozważyć, że niektóre czcionki mogą być nieobecne w różnych systemach, co skutkuje niemożnością normalnego wyświetlania informacji o kodach weryfikacyjnych, musimy ręcznie skopiować czcionki do projektu, utworzyć nowy folder czcionek w projekcie i skopiować do niego czcionki, jak pokazano na poniższym rysunku:
Konfiguracja wygląda następująco:
Według materiałów referencyjnych w Internecie, graficzny kod weryfikacyjny generowany przez test przedstawia się następująco:
Wygenerowany CAPTCHA ma dwie wady:CAPTCHA jest całkowicie (łatwo rozpoznawcza OCR), a litery CAPTCHA są ściśle ze sobą bez żadnych odstępówAby rozwiązać te dwa problemy, zoptymalizowałem kod w następujący sposób:
Kod kontrolera HomeController wygląda następująco:
Ostateczne wizualizacje przedstawiają się następująco:
Na koniec załącz plik czcionki:
Turyści, jeśli chcecie zobaczyć ukrytą zawartość tego wpisu, proszę Odpowiedź
(Koniec)
|