c#:webform使用验证码生成器

1 篇文章 0 订阅

Aspx

Ajax请求Aspx.cs页面方法GetNumber ----------- $("…").src="…"

Aspx.cs

public void GetNumber()
{
    PicValCodeHeler mHelper = new PicValCodeHeler();
    //***生成四位随机数
    string number = mHelper.CreateRandomCode(4);
    string strBase64 = mHelper.CreateImage(number);
    Session["number"] = number;
    Response.Write(strBase64);
}

Helper:

/// <summary>
/// 验证码生成器
/// </summary>
public class PicValCodeHeler
{
    public PicValCodeHeler()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }
    /// 生成随机码
    /// </summary>
    /// <param name="length">随机码个数</param>
    /// <returns></returns>
    public string CreateRandomCode(int length)
    {
        int rand;
        char code;
        string randomcode = String.Empty;

        //生成一定长度的验证码
        System.Random random = new Random();
        for (int i = 0; i < length; i++)
        {
            rand = random.Next();
            
            code = (char)('0' + (char)(rand % 10));

            randomcode += code.ToString();
        }
        return randomcode;
    }

    /// <summary>
    /// 创建随机码图片
    /// </summary>
    /// <param name="randomcode">随机码</param>
    public string CreateImage(string randomcode)
    {
        int randAngle = 45; //随机转动角度
        int mapwidth = (int)(randomcode.Length * 16);
        Bitmap map = new Bitmap(mapwidth, 30);//创建图片背景
        Graphics graph = Graphics.FromImage(map);
        graph.Clear(Color.AliceBlue);//清除画面,填充背景
        graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
        //graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式

        Random rand = new Random();

        //背景噪点生成
        Pen blackPen = new Pen(Color.LightGray, 0);
        for (int i = 0; i < 100; i++)
        {
            int x = rand.Next(0, map.Width);
            int y = rand.Next(0, map.Height);
            graph.DrawRectangle(blackPen, x, y, 1, 1);
        }


        //验证码旋转,防止机器识别
        char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组

        //文字距中
        StringFormat format = new StringFormat(StringFormatFlags.NoClip);
        format.Alignment = StringAlignment.Center;
        format.LineAlignment = StringAlignment.Center;

        //定义颜色
        Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
        //定义字体
        string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
        int cindex = rand.Next(7);

        for (int i = 0; i < chars.Length; i++)
        {
            int findex = rand.Next(5);

            Font f = new System.Drawing.Font(font[findex], 14, System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)
            Brush b = new System.Drawing.SolidBrush(c[cindex]);

            Point dot = new Point(14, 14);
            //graph.DrawString(dot.X.ToString(),fontstyle,new SolidBrush(Color.Black),10,150);//测试X坐标显示间距的
            float angle = rand.Next(-randAngle, randAngle);//转动的度数

            graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
            graph.RotateTransform(angle);
            graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
            //graph.DrawString(chars[i].ToString(),fontstyle,new SolidBrush(Color.Blue),1,1,format);
            graph.RotateTransform(-angle);//转回去
            graph.TranslateTransform(-2, -dot.Y);//移动光标到指定位置,每个字符紧凑显示,避免被软件识别
        }
        //生成图片
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        //Response.ClearContent();
        //Response.ContentType = "image/gif";
        //Response.BinaryWrite(ms.ToArray());
        byte[] mPicByte = ms.ToArray();
        graph.Dispose();
        map.Dispose();

        //***返回图片的Base64
        string strReturnBase64 = Convert.ToBase64String(mPicByte);
        strReturnBase64 = "data:image/gif;base64," + strReturnBase64;
        return strReturnBase64;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值