以前は.NET Frameworkを使って ASP.NET プロジェクトを開発する際、すべてWindowsシステムにデプロイされており、クロスプラットフォームではなかったため、System.Drawingを使って画像検証コードを以下のように生成できました。
.NET Coreプロジェクトでオンライン開発を進める際、画像キャプチャを生成するにはSystem.Drawing.Commonライブラリを参照する必要がありますが、現時点ではSystem.Drawing.Common NuGetパッケージは現在、以下のようにグループ化されています:ウィンドウズ特定のライブラリ。 非Windowsオペレーティングシステム向けにコンパイルする場合、プラットフォームアナライザーはコンパイル時に警告を表示します。 以下の図に示されています:
この呼びかけサイトはすべてのプラットフォームでアクセス可能です。 「フォント」は「ウィンドウ」でのみサポートされています。
.NET 6以前は、System.Drawing.Commonパッケージを使用してコンパイル時の警告を生成せず、ランタイム例外も発生しませんでした。 .NET 6以降、プラットフォームアナライザーは非Windowsオペレーティングシステムの参照コードをコンパイルする際にコンパイル時警告を発行します。 また、設定オプションが設定されていない限り、以下のランタイム例外がスローされます:
System.TypeInitializationException : 'Gdip'の型初期化器が例外を投げました。 ---- System.PlatformNotSupportedException : System.Drawing.Common は非Windowsプラットフォームではサポートされていません。 見るハイパーリンクのログインが見えます。詳細はこちらをご覧ください。 スタックトレース: at 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(String filename, Boolean 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): at 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): at System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): System.Drawing.SafeNativeMethods.Gdip.. cctor() エラーの参考文献:
クロスプラットフォーム画像処理には、Microsoftの公式ドキュメントでは以下のライブラリの使用を推奨しています。
- イメージシャープ
- スキアシャープ
- Microsoft.Maui.Graphics
参考:ハイパーリンクのログインが見えます。
本記事ではSkiaSharpライブラリを使用してグラフィカルCAPTCHAを生成します。SkiaSharpは、GoogleのSkiaグラフィックライブラリ(skia.org)をベースにした.NETプラットフォーム向けのクロスプラットフォーム2DグラフィックスAPIです。。 モバイル、サーバー、デスクトップモデルで画像をレンダリングできる包括的な2D APIを提供します。
住所:ハイパーリンクのログインが見えます。
まず、新しい ASP.NET Core 6プロジェクトとリファレンスを作成しますスキアシャープ該当する図書館は以下の通りです:
プロジェクトをLinuxシステムに展開する場合は、参照が必要ですSkiaSharp.NativeAssets.Linuxクラスでなければ誤差は次のようになります。
Apr 03 18:51:06 raspberrypi dotnet[6203]: fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] 4月3日 18:51:06 raspberrypi dotnet[6203]: リクエスト実行中に未処理の例外が発生しました。 4月3日 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: 'SkiaSharp.SKImageInfo'のタイプ初期化器が例外を投げました。 4月3日 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: 共有ライブラリ「libSkiaSharp」またはその依存関係のいずれかを読み込めません。 読み込み問題の診断を助けるために、LD_DEBUG環境変数を設定することを検討してください:liblibSkiaSharp: shared object file not open with shared object file: no such file or directory 4月3日 18:51:06 raspberrypi dotnet[6203]: at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() 4月3日 18:51:06 raspberrypi dotnet[6203]:SkiaSharp.SKImageInfo:. cctor() 4月3日 18:51:06 raspberrypi dotnet[6203]: --- End of inner exception stack trace --- 4月3日 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, Int32 width, Int32 height, Int32 lineNum, Int32 lineStrookeWidth) in C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:line 184 4月3日 18:51:06 raspberrypi dotnet[6203]: at HomeCloud.Controllers.HomeController.Test() in C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs:80行目 4月3日 18:51:06 raspberrypi dotnet[6203]: lambda_method34(クロージャー、オブジェクト、オブジェクト[]) 異なるシステムで一部のフォントフォントが欠落し、検証コード情報を正常に表示できない可能性があることを考慮するために、フォントを手動でプロジェクトにコピーし、新しいフォントフォルダを作成し、フォントをコピーする必要があります。以下の図のように。
構成は以下の通りです:
インターネット上の参考資料によると、テストによって生成されるグラフィカル検証コードは以下の通りです。
生成されたCAPTCHAには2つの欠点があります。CAPTCHAはすべて黒(OCRで簡単に認識)で、CAPTCHAの文字は空白もなく密集していますこれら二つの問題を解決するために、コードを以下のように最適化しました:
HomeControllerのコントローラーコードは以下の通りです:
最終レンダリングは以下の通りです:
最後にフォントファイルを添付します:
観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ 答える
(終わり)
|