Раніше, при розробці ASP.NET проєктів із використанням .NET Framework, вони всі розгорталися на системах Windows, і вони не могли бути кросплатформенними, тому можна використовувати System.Drawing для генерації кодів перевірки зображень, наступним чином:
Розробка онлайн за допомогою .NET Core проєктів, генерація капч зображень потребує звернення до бібліотеки System.Drawing.Common, але наразіПакет System.Drawing.Common NuGet тепер згрупований як:WindowsКонкретні бібліотеки。 Під час компіляції для операційних систем поза Windows Platform Analyzer попереджає під час компіляції. Як показано на наступному рисунку:
Цей сайт доступний на всіх платформах. 'Шрифт' підтримується лише на 'windows'.
До .NET 6 використання пакету System.Drawing.Common не генерувало жодних попереджень під час компіляції і не створювало жодних винятків під час виконання. Починаючи з .NET 6, Platform Analyzer видає попередження про час компіляції при компіляції референтного коду для операційних систем поза Windows. Також, якщо налаштування не встановлено, буде кинуто наступний виняток під час виконання:
System.TypeInitializationException: Ініціалізатор типу для 'Gdip' викинув виключення. ---- System.PlatformNotSupportedException : System.Drawing.Common не підтримується на платформах, не підключених до Windows. БачитиВхід за гіперпосиланням видно.Для отримання додаткової інформації. Трасування стеку: на System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Ім'я файлу рядка, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): на System.Drawing.Bitmap.. ctor(Ім'я файлу рядка, булеве використанняIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): на System.Drawing.Bitmap.. ctor(Ім'я файлу рядка) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): на System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ MoveNext() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): на System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Внутрішня стежка ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): на System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): на System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): на System.Drawing.SafeNativeMethods.Gdip.. cctor() Посилання на помилку:
Для кросплатформної обробки зображень офіційна документація Microsoft рекомендує використовувати такі бібліотеки:
- ImageSharp
- SkiaSharp
- Microsoft.Maui.Graphics
Посилання:Вхід за гіперпосиланням видно.
У цій статті використовується бібліотека SkiaSharp для створення графічних CAPTCHA,SkiaSharp — це кросплатформенний 2D-графічний API для платформи .NET, заснований на графічній бібліотеці Google Skia (skia.org).。 Він пропонує комплексний 2D API, який можна використовувати на мобільних, серверних і десктопних моделях для рендерингу зображень.
Адреса:Вхід за гіперпосиланням видно.
По-перше, створіть новий ASP.NET проєкт Core 6 та довідкуSkiaSharpВідповідні бібліотеки такі:
Зверніть увагу, що якщо проєкт потрібно розгорнути на Linux-системі, потрібні посиланняSkiaSharp.NativeAssets.Linuxклас, інакше помилка буде такою:
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] 03 квітня 18:51:06 raspberrypi dotnet[6203]: Під час виконання запиту виникло необроблене виключення. 03 квітня 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Ініціалайзер типу для 'SkiaSharp.SKImageInfo' викинув виключення. 03 квітня 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Неможливо завантажити спільну бібліотеку 'libSkiaSharp' або одну з її залежностей. Щоб допомогти діагностувати проблеми із завантаженням, розгляньте можливість встановлення LD_DEBUG змінної середовища: liblibSkiaSharp: cannot open shared object file: Немає такого файлу чи каталогу 03 квітня 18:51:06 raspberrypi dotnet[6203]: at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 03 квітня 18:51:06 raspberrypi dotnet[6203]: на SkiaSharp.SKImageInfo:. cctor() Apr 03 18:51:06 raspberrypi dotnet[6203]: --- End of 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) у C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:рядок 184 03 квітня 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :рядок 80 03 квітня 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Closure, Object, Object[] ) Щоб врахувати, що деякі шрифти можуть бути відсутні в різних системах, що призводить до неможливості нормального відображення інформації про код верифікації, потрібно вручну скопіювати шрифти в проєкт, створити нову папку шрифтів у проєкті та скопіювати шрифти туди, як показано на рисунку нижче:
Конфігурація виглядає так:
Згідно з довідковими матеріалами в Інтернеті, графічний код верифікації, створений тестом, виглядає так:
Згенерована CAPTCHA має два недоліки:CAPTCHA повністю чорна (легко розпізнається OCR), а літери CAPTCHA скупчені одна з одною без проміжків між нимиЩоб розв'язати ці дві проблеми, я оптимізував код наступним чином:
Код контролера HomeController виглядає так:
Остаточні рендери такі:
Нарешті, додайте файл шрифту:
Туристи, якщо ви хочете побачити прихований контент цього допису, будь ласка Відповідь
(Кінець)
|