.NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现

在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging,给出的理由如下:

System.Drawing命名空间对某些操作系统和应用程序类型有一些限制 。
  1. 在Windows,System.Drawing 依赖于GDI+操作系统附带的本机库 。某些Windows SKUS Windows Server Core 或 Windows Nano)不包含此本机库作为 OS 的一部分 。如果使用此命名空间并且无法加载库,则运行时将引发异常 。
  2. 命名空间中的某些类型依赖于 GDI+,而 Windows 服务以及 ASP.NET Core 和 System.Drawing ASP.NET 应用不支持 。这些类型在System.Drawing.Common NuGet包中,并包括 System.Drawing.Bitmap 和 System.Drawing.Font。但是,命名空间中的基元类型(如 System.Drawing.Color 、、 和 System.Drawing.Size System.Drawing.Point System.Drawing.Rectangle )可以在任何应用程序中使用 。
  3. 在 .NET 5 和早期版本中,System.Drawing.Common NuGet 包适用于 Windows、Linux 和 macOS 。但是,存在一些平台差异 。在 Linux 和 macOS 上,GDI+功能由libgdiplus) 库实现 。默认情况下,大多数 Linux 发行版中不会安装此库,也不支持 GDI+ 和 macOS 上Windows的所有功能 。还有一些平台,其中 libgdiplus 完全不可用 。若要在 Linux 和 macOS 上使用 System.Drawing.Common 包中的类型,必须单独安装 libgdiplus 。有关详细信息,请参阅在Linux 上安装 .NET或在macOS 上安装 .NET 。
  4. 在 .NET 6 及更高版本中,System.Drawing.Common NuGet 包仅在 Windows操作系统上受支持 。有关详细信息,请参阅 仅支持System.Drawing.Common Windows 。
所以我将项目中原先使用 System.Drawing.Imaging 实现的方法采用 SkiaSharp 进行了重写 。SkiaSharp是 Google 的Skia 图形库的 .NET 包装器,可用于跨移动、服务器和桌面平台绘制 2D 图形 。SkiaSharp 可与 OpenGL 一起用于硬件加速渲染 。SkiaSharp 最初由 Mono 开发,但现在由 Microsoft 维护,并根据MIT License提供 。
依赖的 Nuget 组件如下:
  1. SkiaSharp
  2. SkiaSharp.NativeAssets.Linux
  3. SkiaSharp.QrCode
using SkiaSharp.QrCode;namespace Common{public class ImgHelper{/// <summary>/// 生成二维码/// </summary>/// <param name="text">二维码内容</param>/// <returns></returns>public static byte[] GetQrCode(string text){using QRCodeGenerator generator = new();using var qr = generator.CreateQrCode(text, ECCLevel.L);SKImageInfo info = new(500, 500);using var surface = SKSurface.Create(info);using var canvas = surface.Canvas;canvas.Render(qr, info.Width, info.Height, SKColors.White, SKColors.Black);using var image = surface.Snapshot();using var data = https://www.huyubaike.com/biancheng/image.Encode(SKEncodedImageFormat.Png, 100);return data.ToArray();}/// /// 从图片截取部分区域/// ///

经验总结扩展阅读