Sebelumnya, saat mengembangkan proyek ASP.NET menggunakan .NET Framework, semuanya disebarkan pada sistem Windows, dan tidak dapat lintas platform, sehingga Anda dapat menggunakan System.Drawing untuk menghasilkan kode verifikasi gambar, sebagai berikut:
Mengembangkan secara online dengan proyek .NET Core, menghasilkan captcha gambar memerlukan referensi ke pustaka System.Drawing.Common, tetapi untuk saat iniPaket NuGet System.Drawing.Common sekarang dikelompokkan sebagai:WindowsPustaka tertentu。 Saat mengkompilasi untuk sistem operasi non-Windows, Platform Analyzer memperingatkan pada waktu kompilasi. Seperti yang ditunjukkan pada gambar berikut:
Situs panggilan ini dapat diakses di semua platform. 'Font' hanya didukung pada 'windows'.
Sebelum .NET 6, menggunakan paket System.Drawing.Common tidak menghasilkan peringatan waktu kompilasi apa pun dan tidak melemparkan pengecualian runtime apa pun. Dimulai dengan .NET 6, Platform Analyzer mengeluarkan peringatan waktu kompilasi saat mengkompilasi kode referensi untuk sistem operasi non-Windows. Selain itu, kecuali opsi konfigurasi diatur, pengecualian runtime berikut akan dilemparkan:
System.TypeInitializationException : Jenis inisialisasi untuk 'Gdip' melemparkan pengecualian. ---- System.PlatformNotSupportedException : System.Drawing.Common tidak didukung pada platform non-Windows. LihatLogin hyperlink terlihat.untuk informasi lebih lanjut. Jejak Tumpukan: di System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(Nama file string, IntPtr& bitmap) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): di System.Drawing.Bitmap.. ctor(Nama file string, Boolean useIcm) /_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): di System.Drawing.Bitmap.. ctor(Nama file string) /_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): di System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+ PindahBerikutnya() /_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): di System.Linq.Enumerable.SelectEnumerableIterator'2.MoveNext() ----- Jejak Tumpukan Dalam ----- /_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): di System.Drawing.LibraryResolver.EnsureRegistered() /_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): di System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize() /_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): di System.Drawing.SafeNativeMethods.Gdip.. CCTOR() Referensi Kesalahan:
Untuk pemrosesan gambar lintas platform, dokumentasi resmi Microsoft merekomendasikan penggunaan pustaka berikut:
- GambarTajam
- SkiaTajam
- Microsoft.Maui.Grafis
Referensi:Login hyperlink terlihat.
Artikel ini menggunakan perpustakaan SkiaSharp untuk menghasilkan CAPTCHA grafis,SkiaSharp adalah API grafis 2D lintas platform untuk platform .NET berdasarkan perpustakaan grafis Skia Google (skia.org).。 Ini menawarkan API 2D komprehensif yang dapat digunakan di seluruh model seluler, server, dan desktop untuk merender gambar.
Alamat:Login hyperlink terlihat.
Pertama, buat proyek dan referensi ASP.NET Core 6 baruSkiaTajamPerpustakaan yang relevan adalah sebagai berikut:
Perhatikan bahwa jika proyek perlu disebarkan ke sistem Linux, referensi diperlukanSkiaSharp.NativeAssets.Linux, jika tidak, kesalahannya akan menjadi sebagai berikut:
Apr 03 18:51:06 raspberrypi dotnet[6203]: gagal: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] Apr 03 18:51:06 raspberrypi dotnet[6203]: Pengecualian yang tidak ditangani telah terjadi saat mengeksekusi permintaan. Apr 03 18:51:06 raspberrypi dotnet[6203]: System.TypeInitializationException: Jenis inisialisasi untuk 'SkiaSharp.SKImageInfo' melemparkan pengecualian. Apr 03 18:51:06 raspberrypi dotnet[6203]: ---> System.DllNotFoundException: Tidak dapat memuat perpustakaan bersama 'libSkiaSharp' atau salah satu dependensinya. Untuk membantu mendiagnosis masalah pemuatan, pertimbangkan untuk mengatur variabel lingkungan LD_DEBUG: liblibSkiaSharp: tidak dapat membuka file objek bersama: Tidak ada file atau direktori seperti itu Apr 03 18:51:06 raspberrypi dotnet[6203]: di SkiaSharp.SkiaApi.sk_colortype_get_default_8888() Apr 03 18:51:06 raspberrypi dotnet[6203]: di SkiaSharp.SKImageInfo:. CCTOR() Apr 03 18:51:06 raspberrypi dotnet[6203]: --- Akhir dari jejak tumpukan pengecualian dalam --- Apr 03 18:51:06 raspberrypi dotnet[6203]: di HomeCloud.ImageCaptcha.GetCaptcha(String captchaText, lebar Int32, tinggi Int32, Int32 lineNum, Int32 lineStrookeWidth) di C: \Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\ImageCaptcha.cs:line 184 Apr 03 18:51:06 raspberrypi dotnet[6203]: di HomeCloud.Controllers.HomeController.Test() di C:\Users\itsvse_pc\source\repos\ConsoleApp1\HomeCloud\Controllers\HomeController.cs :baris 80 Apr 03 18:51:06 raspberrypi dotnet[6203]: at lambda_method34(Penutupan , Objek , Objek[] ) Untuk mempertimbangkan bahwa beberapa font font mungkin hilang di bawah sistem yang berbeda, mengakibatkan ketidakmampuan untuk menampilkan informasi kode verifikasi secara normal, kita perlu menyalin font secara manual ke dalam proyek, membuat folder font baru dalam proyek, dan menyalin font ke dalamnya, seperti yang ditunjukkan pada gambar di bawah ini:
Konfigurasinya adalah sebagai berikut:
Menurut bahan referensi di Internet, kode verifikasi grafis yang dihasilkan oleh pengujian adalah sebagai berikut:
CAPTCHA yang dihasilkan memiliki dua kelemahan:CAPTCHA serba hitam (mudah dikenali oleh OCR), dan huruf CAPTCHA berdesakan tanpa spasi apa punUntuk mengatasi kedua masalah ini, saya mengoptimalkan kode sebagai berikut:
Kode pengontrol HomeController adalah sebagai berikut:
Rendering akhir adalah sebagai berikut:
Terakhir, lampirkan file font:
Wisatawan, jika Anda ingin melihat konten tersembunyi dari posting ini, silakan Jawab
(Akhir)
|