首页 > 其他分享 >.net 7 验证码功能

.net 7 验证码功能

时间:2023-08-01 14:57:47浏览次数:33  
标签:功能 验证码 Next using var new net SixLabors ImageSharp

using SixLabors.ImageSharp

还需要用到 2 个的插件, SixLabors.Fonts 和 SixLabors.ImageSharp.Drawing
通过CLI手动安装
dotnet add package SixLabors.ImageSharp.Drawing --version 1.0.0-beta15
dotnet add package SixLabors.Fonts --version 1.0.0-beta19


using System.Text;
using NPOI.OpenXmlFormats.Spreadsheet;
using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using ZXing;

namespace Cps.WebApi.Core.Wx
{
    /// <summary>
    /// 生成验证码
    /// </summary>
    public class ValidateCode
    {
        private static readonly SixLabors.ImageSharp.Color[] Colors = {
            SixLabors.ImageSharp.Color.Black,
            SixLabors.ImageSharp.Color.Red,
            SixLabors.ImageSharp.Color.Blue,
            SixLabors.ImageSharp.Color.Green,
            SixLabors.ImageSharp.Color.Orange,
            SixLabors.ImageSharp.Color.Brown,
            SixLabors.ImageSharp.Color.Brown,
            SixLabors.ImageSharp.Color.DarkBlue
        };
        private static readonly char[] Chars = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };
        //private static readonly int Width = 90;
        //private static readonly int Height = 35;

        /// <summary>
        /// 获取转码
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        private static string GenCode(int num)
        {
            var code = string.Empty;
            var r = new Random();

            for (int i = 0; i < num; i++)
            {
                code += Chars[r.Next(Chars.Length)].ToString();
            }

            return code;
        }

        /// <summary>
        /// 生成验证码
        /// </summary>
        /// <param name="CodeLength"></param>
        /// <param name="Width"></param>
        /// <param name="Height"></param>
        /// <param name="FontSize"></param>
        /// <returns></returns>
        public static (string code, string base64) CreateValidateGraphic(int CodeLength, int Width, int Height, int FontSize)
        {
            var code = GenCode(CodeLength);
            var r = new Random();
            using var image = new Image<Rgba32>(Width, Height);
            // 字体
            var font = SixLabors.Fonts.SystemFonts.CreateFont(SixLabors.Fonts.SystemFonts.Families.First().Name, FontSize, SixLabors.Fonts.FontStyle.Bold);
            image.Mutate(ctx =>
            {
                // 白底背景
                ctx.BackgroundColor(SixLabors.ImageSharp.Color.White);

                // 画验证码
                for (int i = 0; i < code.Length; i++)
                {
                    ctx.DrawText(code[i].ToString()
                        , font
                        , Colors[r.Next(Colors.Length)]
                        , new PointF(20 * i + 10, r.Next(2, 12)));
                }

                // 画干扰线
                for (int i = 0; i < 6; i++)
                {
                    var pen = new Pen(Colors[r.Next(Colors.Length)], 1);
                    var p1 = new PointF(r.Next(Width), r.Next(Height));
                    var p2 = new PointF(r.Next(Width), r.Next(Height));

                    ctx.DrawLines(pen, p1, p2);
                }

                // 画噪点
                for (int i = 0; i < 60; i++)
                {
                    var pen = new Pen(Colors[r.Next(Colors.Length)], 1);
                    var p1 = new PointF(r.Next(Width), r.Next(Height));
                    var p2 = new PointF(p1.X + 1f, p1.Y + 1f);

                    ctx.DrawLines(pen, p1, p2);
                }
            });
            using var ms = new System.IO.MemoryStream();
            //  格式 自定义
            image.SaveAsPng(ms);
            //image.Save(ms, new PngEncoder());
            byte[] imageBytes = ms.ToArray();
            var base64String = Convert.ToBase64String(imageBytes);
            return (code, "data:image/png;base64," + base64String);
        }
    }
}

调用方法

        /// <summary>
        /// 获取验证码
        /// </summary>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet]
        public IActionResult GetValidateGraphic()
        {
            try
            {
                var YzmData = ValidateCode.CreateValidateGraphic(4, 95, 40, 22);
                System.Random random = new System.Random();
                string RandomValue = random.Next(0, 2147483646).ToString();
                CpsCache.SetDatas("LoginYzm_" + RandomValue, YzmData.code, (DateTime.Now.AddMinutes(5) - DateTime.Now));
                var retData = new
                {
                    RandomValue = RandomValue,
                    Img = YzmData.base64
                };
                return Success(retData);
            }
            catch (Exception ex)
            {
                return Fail("操作失败," + ex.Message);
            }
        }

 

标签:功能,验证码,Next,using,var,new,net,SixLabors,ImageSharp
From: https://www.cnblogs.com/wtlcy/p/17596484.html

相关文章

  • netfilter中有哪些挂载点(hook points)?
    5个挂载点,挂载点有各种数据包处理的规则。 分别是:PREROUTINGINPUTFORWAROUTPUTPOSTROUTING 这些挂接点(hookpoints),是数据包处理的不同的阶段。 每个挂节点上,都可以挂载不同的包的处理规则,从而实现对数据包的处理和过滤。 ......
  • ADO.NET的最佳实践技巧
    ADO.NET的最佳实践技巧简介本文为您提供了在MicrosoftADO.NET应用程序中实现和获得最佳性能、可伸缩性以及功能的最佳解决方案;同时也讲述了使用ADO.NET中可用对象的最佳实践;并提出一些有助于优化ADO.NET应用程序设计的建议。本文包含:•有关.NET框架包含的.NET框架数据......
  • [转].Net2.0连接PG数据注意事项
    .Net2.0连接PG数据注意事项第一次用.net操作PG[.NET2.0]一:Npgsql版本问题1:如果是.net2.0  建议用2.0.11.0[NuGet搜索npgsql第一个的最低版本]如果是.net3.5 最高只能到2.2.62.2.7就需要.net4了二:SqlHelp操作就像操作SQLServer那样操作,只是几个类换一下。SqlConnect......
  • Excel VBA 窗体UserForm制作菜单栏与添加窗体最大化最小化功能(转载)
    窗体'--------------------------------------------------------'->Forms'Module'ClassModules'--------------------------------------------------------OptionExplicitPrivateDeclareFunctionFindWindowLib"user32&qu......
  • profinet转CCLINK IE FIELD BASIC 总线网关profinet接口
    协议的不同,数据难以交换,这是生产管理系统中一直存在的难题。然而,现在有一款神奇的产品出现了,它能够将各种profinet 设备接入到CCLINKIEFIELDBASIC 网络中。这就是捷米JM-PNM-CCLKIE,一款CCLINKIEFIELDBASIC 从站功能的通讯网关。它不仅连接到CCLINKIEFIELDBASIC ......
  • ASP.NET CORE下日志NLOG使用
    ASP.NETCORE下日志NLOG使用摘自《深入浅出ASP.NETCORE》NUGET:NLog.Web.AspNetCore4.9.0根目录下nlog.config<?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="htt......
  • asp.net core之日志
    日志记录在应用程序开发中起着至关重要的作用,它可以帮助开发人员诊断和调试问题,同时也是监控和性能优化的重要工具。ASP.NETCore提供了强大且灵活的日志记录功能,本文将详细介绍ASP.NETCore中的日志记录,包括日志配置、日志类别级别、使用场景以及日志记录提供程序。日志配置......
  • 7种方法!教你如何使用Telerik UI for ASP.NET定制编辑器
    TelerikUIforASP.NETCore是用于跨平台响应式Web和云开发的最完整的UI工具集,拥有超过60个由KendoUI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格,提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。TelerikUIforASP.NETCore的编辑器是一个多功能的所......
  • 6.6 卷积神经网络LeNet
    LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。这个模型是由AT&T贝尔实验室的研究员YannLeCun在1989年提出的(并以其命名),目的是识别图像中的手写数字。总体来看,LeNet由两个部分组成:卷积编码器:由两个卷积层组成;全连接层密集块:由三......
  • NET6 Webapi 大驼峰传到前端变成了小驼峰
    JsonSerializerOptions.PropertyNamingPolicy属性services.AddControllers().AddJsonOptions(options=>{//获取或设置一个值,该值指定用于将对象的属性名称转换为其他格式(例如camel大小写)的策略;若为null,则保持属性名称不变......