首页 > 其他分享 >.NET 生成可跨平台得图片二维码

.NET 生成可跨平台得图片二维码

时间:2022-11-28 09:47:10浏览次数:42  
标签:drawStyle random 跨平台 Next width 二维码 SKColors NET height

  1. 下载包nuget SkiaSharp
  2. 创建帮助类 VerificationCodeHelper
点击查看代码
 public class VerifyCodeHelper
 {
        /// <summary>
        /// 获取图像数字验证码
        /// </summary>
        /// <param name="text">验证码内容,如4为数字</param>
        /// <returns></returns>
        public static byte[] GetVerifyCode(string text)
        {

            int width = 74;
            int height = 36;

            Random random = new();
            //创建bitmap位图
            using SKBitmap image = new(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);
            //创建画笔
            using SKCanvas canvas = new(image);
            //填充背景颜色为白色
            canvas.DrawColor(SKColors.White);
            //颜色列表
            SKColor[] colors = { SKColors.Black, SKColors.Red, SKColors.Blue, SKColors.Green, SKColors.Orange, SKColors.Brown, SKColors.DarkBlue };
            //画图片的背景噪音线
            for (int i = 0; i < 20; i++)
            {
                using SKPaint drawStyle = new();
                drawStyle.Color = colors[random.Next(colors.Length)];
                canvas.DrawLine(random.Next(0, width), random.Next(0, height), random.Next(0, width), random.Next(0, height), drawStyle);
            }
            //将文字写到画布上
            using (SKPaint drawStyle = new())
            {
                drawStyle.TextSize = height;
                drawStyle.StrokeWidth = 1;
                float emHeight = height - (float)height * (float)0.14;
                float emWidth = ((float)width / text.Length) - ((float)width * (float)0.13) + 5;
                for (int i = 0; i < text.Length; i++)
                {
                    drawStyle.Color = colors[random.Next(colors.Length)];

                    var jg = (width - (emWidth * text.Length)) / text.Length - 1;
                    //画在画板上
                    canvas.DrawText(text[i].ToString(),  emWidth * i + jg, emHeight, drawStyle);
                }

            }

            //画图片的前景噪音点
            for (int i = 0; i < 100; i++)
            {
                image.SetPixel(random.Next(0, width), random.Next(0, height), colors[random.Next(colors.Length)]);
            }

            using var img = SKImage.FromBitmap(image);
            using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);
            return p.ToArray();
        }

    }
  1. 调用
点击查看代码
 		[HttpGet("ObtainImageVerificationCode")]
        [CustomAnonymousFiler]
        public IActionResult ObtainImageVerificationCode()
        {
            //var images = ImageVerificationCode.CreateVerifyCode(4, VerifyCodeType.NUM);
            Random rad = new Random(); //实例化随机数产生器rad;
            int value = rad.Next(1000, 10000);
            var arr = VerifyCodeHelper.GetVerifyCode(value.ToString());
            return Ok(new { Id = key, Image = "data:image/png;base64," + Convert.ToBase64String(arr) });
        }

标签:drawStyle,random,跨平台,Next,width,二维码,SKColors,NET,height
From: https://www.cnblogs.com/chuichuizi/p/16931348.html

相关文章

  • 基于.NET三维控件的个性化管道软件开发
    1简介管道广泛用于化工、工厂、建筑、市政等方面,关系到国计民生。虽然管道设计软件种类繁多,有的也非常强大(然而也非常昂贵),但也并不能完全满足个性化需要。如何快速开发......
  • Modbus RTU转Profinet网关将信衡控制秤接入Profinet的配置过程
    本案例控制的主要对象是信衡控制秤仪表的数据参数的显示和报警,仪表型号XH3180-K,系统主PLC选用西门子S71200,将设备接入西门子PLC的采集数据模块采用MODBUS转PROFINE......
  • 拓端tecdat|r语言代码编写对LASSO,Ridge岭回归和Elastic Net模型实现
     介绍Glmnet是一个通过惩罚最大似然来拟合广义线性模型的包。正则化路径是针对正则化参数λ的值网格处的套索或弹性网络罚值计算的。该算法速度极快,可以利用输入矩阵中的稀......
  • Netty源码-00-启动
    一源码我fork的源码带注释分支study二环境版本Netty4.1.169Java8三Samples1服务端1.1启动类/**Copyright2012TheNettyProject**......
  • 拓端tecdat|python编程代写对网络图networkx进行社区检测和彩色绘图
    python对网络图networkx进行社区检测和彩色绘图 以下是创建图表,检测其中的社区,然后在少于10行的python中使用由其社区着色的节点进行可视化的方法......
  • 基于.net C# Socket WinForm MQTT 客户端开发
     1、什么是MQTT?MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议......
  • 菩提阁外卖各种bug_network
    原项目视频:https://www.bilibili.com/video/BV13a411q753/下面是遇到的有关的bug(这里只包括了基础篇,没有引入redis那些。所以都是前面103集遇到的bug)静态资源映射失败......
  • .NET6之MiniAPI(十七):缓存
    缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.netcore引入了本地内存缓存和分布式缓存。先看一下本地内存缓存:usingMicrosoft.Extensions.Caching.M......
  • .NET6之MiniAPI(十七):缓存
    缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.netcore引入了本地内存缓存和分布式缓存。先看一下本地内存缓存:usingMicrosoft.Extensions.Caching.M......
  • .NET6之MiniAPI(十六):数据保护
    对于web,安全是一个永久的话题,所以ASP.NETCore数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。ASP.NETCore的数据保护是根据本机的一个ke......