Ранее, при разработке ASP.NET проектов с использованием .NET Framework, все они развернулись на системах Windows, и они не могли быть кроссплатформенными, поэтому System.Drawing можно использовать для генерации кодов проверки изображений, следующим образом:
Для онлайн-разработки с проектами на .NET Core создание капч изображений требует обращения к библиотеке System.Drawing.Common, но покаПакет System.Drawing.Common NuGet теперь сгруппирован следующим образом:ВиндоусКонкретные библиотеки。 При компиляции для операционных систем вне 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 (String filename, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): в System.Drawing.Bitmap.. ctor(Имя файла строки, булевое useIcm) /_/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 --- 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 следующий:
Окончательные рендеры следующие:
Наконец, приложите файл шрифта:
Туристы, если вы хотите увидеть скрытое содержание этого поста, пожалуйста Ответ
(Конец)
|