搜索

查看: 3041|回复: 11

[ASP.NET] .NET SkiaSharp 生成二维码验证码及指定区域截取方法实现

[复制链接]
发表于 2023-5-4 11:32:03 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:32:03 3041 11 看全部
目录
  • 正文
  • 依赖的 Nuget 组件如下
    正文
    在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging ,给出的理由如下:
    System.Drawing命名空间对某些操作系统和应用程序类型有一些限制。
    在Windows, System.Drawing 依赖于GDI+操作系统附带的本机库。 某些Windows SKUS Windows Server Core 或 Windows Nano)不包含此本机库作为 OS 的一部分。 如果使用此命名空间并且无法加载库,则运行时将引发异常。
    命名空间中的某些类型依赖于 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 )可以在任何应用程序中使用。
    在 .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。
    在 .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 组件如下
  • SkiaSharp
  • SkiaSharp.NativeAssets.Linux
  • SkiaSharp.QrCode
    using SkiaSharp.QrCode;
    namespace Common
    {
        public class ImgHelper
        {
            ///
            /// 生成二维码
            ///
            /// 二维码内容
            ///
            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 = image.Encode(SKEncodedImageFormat.Png, 100);
                return data.ToArray();
            }
            ///
            /// 从图片截取部分区域
            ///
            /// 源图路径
            /// 距上
            /// 距左
            /// 宽度
            /// 高度
            ///
            public static byte[] Screenshot(string fromImagePath, int offsetX, int offsetY, int width, int height)
            {
                using var original = SKBitmap.Decode(fromImagePath);
                using SKBitmap bitmap = new(width, height);
                using SKCanvas canvas = new(bitmap);
                SKRect sourceRect = new(offsetX, offsetY, offsetX + width, offsetY + height);
                SKRect destRect = new(0, 0, width, height);
                canvas.DrawBitmap(original, sourceRect, destRect);
                using var img = SKImage.FromBitmap(bitmap);
                using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);
                return p.ToArray();
            }
            ///
            /// 获取图像数字验证码
            ///
            /// 验证码内容,如4为数字
            ///
            public static byte[] GetVerifyCode(string text)
            {
                int width = 128;
                int height = 45;
                Random random = new();
                //创建bitmap位图
                using SKBitmap image = new(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);
                //创建画笔
                using SKCanvas canvas = new(image);
                //填充背景颜色为白色
                canvas.DrawColor(SKColors.White);
                //画图片的背景噪音线
                for (int i = 0; i
    项目如果是在 windows 服务器下运行则不需要任何安装任何依赖项,如果是在 linux 服务下运行则需要安装 libfontconfig1,如 ubuntu 的安装命令
    apt-get update
    apt-get -y install libfontconfig1

    如果是采用 docker 模式运行,则需要在 dockerfile 中添加如下配置,该命令适用于 debian 和 ubuntu 的 docker
    RUN apt-get update && apt-get -y install libfontconfig1

    至此 .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现 就讲解完了,有任何不明白的,可以在文章下面评论或者私信我,欢迎大家积极的讨论交流,有兴趣的朋友可以关注我目前在维护的一个 .NET 基础框架项目,项目地址如下
    https://github.com/berkerdong/NetEngine
    https://gitee.com/berkerdong/NetEngine
    以上就是.NET SkiaSharp 生成二维码验证码及指定区域截取方法实现的详细内容,更多关于.NET SkiaSharp 二维码验证码截取的资料请关注知鸟论坛其它相关文章!
  • 回复

    使用道具 举报

    发表于 2023-6-28 20:12:01 | 显示全部楼层
    462710480 2023-6-28 20:12:01 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-28 23:58:42 | 显示全部楼层
    当当当当裤裆坦 2023-6-28 23:58:42 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 08:36:23 | 显示全部楼层
    执着等待等wc 2023-6-29 08:36:23 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-29 10:04:00 | 显示全部楼层
    麻辣鸡翅 2023-6-29 10:04:00 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 13:44:37 | 显示全部楼层
    井底燕雀傥 2023-6-29 13:44:37 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 14:33:32 | 显示全部楼层
    Gordon520 2023-6-29 14:33:32 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 15:00:44 | 显示全部楼层
    小妖花满楼满fx 2023-6-29 15:00:44 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-29 16:50:11 | 显示全部楼层
    123456819 2023-6-29 16:50:11 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 16:57:51 | 显示全部楼层
    风来时狂放 2023-6-29 16:57:51 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表