c# 使用SkiaSharp实现跨平台生成验证码

csharp使用SkiaSharp实现跨平台生成验证码

一.NuGet安装包SkiaSharp:

在这里插入图片描述

二.核心代码:

       /// <summary>
        /// 生成验证码
        /// </summary>
        /// <param name="width">图片宽度</param>
        /// <param name="height">图片高度</param>
        /// <param name="codeLength">验证码字数</param>
        /// <param name="fontSize">字体大小</param>
        /// <param name="maxPy">垂直最大误差</param>
        /// <param name="key">验证码key值</param>
        /// <param name="value">验证码value</param>
        /// <param name="memoryStream">验证码</param>
        private void GetVerificationCode(int width, int height, int codeLength, float fontSize, int maxPy, out string key, out string value, out MemoryStream memoryStream)
        {
            Random random = new Random();
            key = (DateTime.Now.Ticks + random.Next(0, 100000).ToString()).Substring(4);
            value = "";
            memoryStream = new MemoryStream();
            string codes = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
            for (int i = 0; i < codeLength; i++)
            {
                value += codes[random.Next(codes.Length)].ToString();
            }
            using (var surface = SKSurface.Create(new SKImageInfo(width, height)))
            {
                var canvas = surface.Canvas;
                canvas.Clear(SKColors.White);
                canvas.Translate(width / 2, height / 2);

                for (int i = 0; i < value.Length; i++)
                {
                    double px = - value.Length / 2.0 * fontSize + fontSize * i;
                    var coord = new SKPoint((int)px, random.Next(maxPy) - maxPy / 2);
                    var paint = new SKPaint()
                    {
                        Color = new SKColor((byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255)),
                        IsAntialias = true, // 抗锯齿
                        Style = SKPaintStyle.Fill,
                        TextAlign = SKTextAlign.Center,
                        TextSize = fontSize,
                        TextScaleX = (float)random.NextDouble() + 1,
                        Typeface = SKTypeface.FromFamilyName("Microsoft YaHei", SKFontStyle.Normal)
                    };
                    float rr = (float)(random.NextDouble() / 2 - 0.25);
                    canvas.RotateRadians(rr);
                    canvas.DrawText(value[i].ToString(), coord, paint);
                    canvas.RotateRadians(-rr);
                }
                for (int i = 0;i < width*height/500;i++)
                {
                    var point1 = new SKPoint(random.Next(width)-width/2, random.Next(height)-height/2);
                    var point2 = new SKPoint(random.Next(width) - width / 2, random.Next(height) - height / 2);
                    var paint = new SKPaint()
                    {
                        Color = new SKColor((byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255),126),
                        IsAntialias = true, // 抗锯齿
                        Style = SKPaintStyle.Fill,
                    };
                    canvas.DrawLine(point1,point2, paint);
                }
                for (int i = 0; i < width * height / 200; i++)
                {
                    float fx = (float)(random.Next(width) - width / 2);
                    float fx1 = 2;
                    float fy = (float)(random.Next(height) - height / 2);
                    float fy1 = 2;
                    var paint = new SKPaint()
                    {
                        Color = new SKColor((byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255), 100),
                        IsAntialias = true, // 抗锯齿
                        Style = SKPaintStyle.Fill,
                    };
                    canvas.DrawOval(fx, fy,fx1,fy1, paint);
                }
                using (var image = surface.Snapshot())
                {
                    image.Encode(SKEncodedImageFormat.Png, 80).SaveTo(memoryStream);
                }
            }
        }

三.效果预览:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值