验证码的生成

本文详细介绍了如何生成验证码的步骤,包括在控制器中定义方法,创建随机字符串,将验证码存入session,以及生成干扰线和前景干扰点的图片。通过示例代码展示了如何使用Graphics绘制文字、干扰线和干扰点,并将图片保存到内存流中。
摘要由CSDN通过智能技术生成

在很多软件登录的时候,会用到验证码,如下图所示。

那么接下来就给大家分享一下验证码生成的方法。希望对大家有所帮助

在控制器定义一个方法

首先声明一个字符串,可以直接赋值为固定的字符串,也可以生成一个随机字符串

例如:string strRandom = "abc";

string strRandom = ValidCodeUtils.GetRandomCode(5); 随机生成一个5位数的字符串

:ValidCodeUtils.GetRandomCode是创建类里面定义的方法,方法详情如下

创建一个类把需要用的方法封装在里面方便使用。

定义一个方法获取随机字符串

需要实现的操作:

产生数字和密码混合的随机数

根据当前随机数来确定字符串

代码如下

public static string GetRandomCode(int intLength)

        {

            /*产生数字和密码混合的随机数*/

            string strReturn = string.Empty;

            Random random = new Random();//随机数。表示伪随机数生成器

            for (int i = 0; i < intLength; i++)

            {

                char cRerult;

                int intRandom = random.Next();//产生一个非负随机整数

                /*根据当前随机数来确定字符串*/

                //intRandom % 3 获取的是intRandom/3 得到的余数

                if (intRandom % 3 == 0)

                {

                    //产生数字

                    //位数来产生数字

                    cRerult = (char)(0x30 + (intRandom % 10));

                }

                else if (intRandom % 3 == 1)

                {

                    //位数产生大写字母:大写字符 65-97 A 65

                    //68 D  25 Z

                    cRerult = (char)(0x41 + (intRandom % 0x1a));

                }

                else

                {

                    //余数为2

                    //产生小写字母 98-116

                    cRerult = (char)(0x61 + (intRandom % 0x1a));

                }

                strReturn += cRerult.ToString();

            }

            return strReturn;

        }

然后将验证码存入session会话

Session["validCode"] = strRandom;

再根据验证码产生图片

byte[] imgByte = ValidCodeUtils.CreateImage(strRandom);

注:ValidCodeUtils.CreateImage是创建的类里面定义的方法,详情如下。

定义一个方法根据字符串创建验证码

需要实现的操作:

新增图片

在图片上绘制文字

在图片上绘制干扰线

绘制图片的前景干扰点

在最外边绘制边框

将图转保存到内存流中

代码如下:

public static byte[] CreateImage(string strRandom)

        {

            //新增图片

            Bitmap newBitmap = new Bitmap(strRandom.Length * 20, 38);//Bitmap是用于处理由像素数据定义的图像对象。用指定的大小初始化Bitmap类的新实例

            Graphics g = Graphics.FromImage(newBitmap);//Graphics:封装一个GDI+绘图画面。从指定的image创建个新的Graphics

            g.Clear(Color.White);//清除整个绘图面并以指定背景颜色填充

            //在图片上绘制文字

            SolidBrush solidBrush = new SolidBrush(Color.Red);//SolidBrush 定义单色画笔,用于填充图形形状

            g.DrawString(strRandom, new Font("Aril", 17), solidBrush, 12, 1);//在指定的位置并用指定的Brush和Font对象绘制指定的文本字符串

            //在图片上绘制干扰线

            Random random = new Random();

            for (int i = 0; i < 10; i++)

            {

                //产生一条线,并绘制到画布。 起始点(x,y)  总结点

                int x1 = random.Next(newBitmap.Width);

                int y1 = random.Next(newBitmap.Height);

                int x2 = random.Next(newBitmap.Width);

                int y2 = random.Next(newBitmap.Height);

                g.DrawLine(new Pen(Color.DarkGray), x1, y1, x2, y2);//绘制一条连接由坐标对指定的两个点的线条

            }

            //绘制图片的前景干扰点

            for (int i = 0; i < 100; i++)

            {

                int x = random.Next(newBitmap.Width);

                int y = random.Next(newBitmap.Height);

                newBitmap.SetPixel(x, y, Color.FromArgb(random.Next()));

            }

            //在最外边绘制边框

            g.DrawRectangle(new Pen(Color.Blue), 0, 0, newBitmap.Width, newBitmap.Height);//绘制由坐标对、宽度和高度指定的矩形

            g.DrawRectangle(new Pen(Color.Blue), -1, -1, newBitmap.Width, newBitmap.Height);

            //将图转保存到内存流中

            MemoryStream ms = new MemoryStream();//创建其支持其存储区为内存的流

            newBitmap.Save(ms, ImageFormat.Jpeg);//将此图片以指定的格式保存到指定的流中

            return ms.ToArray();//将流内容写入byte数组返回

        }

最后返回图片信息

return File(imgByte, @"image/jpeg");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值