zoukankan      html  css  js  c++  java
  • C#.Net 较完美随机验证码

    转载:来源:http://tmsoft.lsxy.com/index.php?load=read&id=487
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    namespace WebApplication1.验证码
    {
     ///  <summary>
     ///  完美随机验证码  0.10
     ///  Verion:0.10
     ///  Description:随机生成设定验证码,并随机旋转一定角度,字体颜色不同
     ///  </summary>

     public class ValidateCode : System.Web.UI.Page
     {
      private void Page_Load(object sender, System.EventArgs e)
      {
       string  randomcode  =  this.CreateRandomCode(4);
       Session["ValidateCode"]  =  randomcode;
       //ViewState["ValidateCode"]  =  randomcode;
       this.CreateImage(randomcode);

      }

      ///  <summary>
      ///  生成随机码
      ///  </summary>
      ///  <param  name="length">随机码个数</param>
      ///  <returns></returns>
      private  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();

        if(rand%3 == 0)
        {
         code = (char)('A' + (char)(rand%26));
        }
        else
        {
         code = (char)('0' + (char)(rand%10));
        }

        randomcode += code.ToString();
       }
       return  randomcode;
      }
      
      ///  <summary>
      ///  创建随机码图片
      ///  </summary>
      ///  <param  name="randomcode">随机码</param>
      private  void  CreateImage(string randomcode)
      {
       int randAngle = 45; //随机转动角度
       int mapwidth = (int)(randomcode.Length * 23);
       Bitmap map = new Bitmap(mapwidth,28);//创建图片背景
       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<50;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", "宋体" };

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

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

        Point dot = new Point(16,16);
        //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);//移动光标到指定位置
       }
       //graph.DrawString(randomcode,fontstyle,new SolidBrush(Color.Blue),2,2); //标准随机码
                           
       //生成图片
       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());
       graph.Dispose();
       map.Dispose();
      }


      #region Web 窗体设计器生成的代码
      override protected void OnInit(EventArgs e)
      {
       //
       // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
       //
       InitializeComponent();
       base.OnInit(e);
      }
      
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {   
       this.Load += new System.EventHandler(this.Page_Load);
      }
      #endregion
     }
    }

  • 相关阅读:
    1.1图形验证码的生成
    1.3蓝图导入问题
    1.2数据库迁移
    1.1首页显示
    1.3 日志配置以及蓝图的抽取
    1.2 app工厂以及db问题的解决
    每日总结
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/yuanermen/p/947548.html
Copyright © 2011-2022 走看看