栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)

12306网站推出“彩色动态验证码机制”,新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼“看不清”,称“那个验证码,是毕加索的抽象画么!”铁总客服则表示:为了能正常购票只能这样。而多家抢票软件接近“报废”,引发不少网友不满的吐槽称“太抽象太艺术了”。
以前做项目有时候也会用到验证码,但基本都是静态的,这次也想凑凑12306的热闹。闲言少续,切入正题,先上代码。

实现方法:

 public void ShowCode()
    {
      //对象实例化
      Validate GifValidate = new Validate();

      #region 对验证码进行设置(不进行设置时,将以默认值生成)
      //验证码位数,不小于4位
      GifValidate.ValidateCodeCount = 4;
      //验证码字体型号(默认13)
      GifValidate.ValidateCodeSize = 13;
      //验证码图片高度,高度越大,字符的上下偏移量就越明显
      GifValidate.ImageHeight = 23;
      //验证码字符及线条颜色(需要参考颜色类)
      GifValidate.DrawColor = System.Drawing.Color.BlueViolet;
      //验证码字体(需要填写服务器安装的字体)
      GifValidate.ValidateCodeFont = "Arial";
      //验证码字符是否消除锯齿
      GifValidate.FontTextRenderingHint = false;
      //定义验证码中所有的字符(","分离),似乎暂时不支持中文
      GifValidate.AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
      #endregion

      //输出图像(Session名称)
      GifValidate.OutPutValidate("GetCode");
    }

调用主要方法:

public class Validate
  {
    public string AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
    public Color DrawColor = Color.BlueViolet;
    public bool FontTextRenderingHint = false;
    public int ImageHeight = 0x17;
    private byte TruevalidateCodeCount = 4;
    protected string ValidateCode = "";
    public string ValidateCodeFont = "Arial";
    public float ValidateCodeSize = 13f;

    private void CreateImageBmp(out Bitmap Imageframe)
    {
      char[] chArray = this.ValidateCode.ToCharArray(0, this.ValidateCodeCount);
      int width = (int) (((this.TruevalidateCodeCount * this.ValidateCodeSize) * 1.3) + 4.0);
      Imageframe = new Bitmap(width, this.ImageHeight);
      Graphics graphics = Graphics.FromImage(Imageframe);
      graphics.Clear(Color.White);
      Font font = new Font(this.ValidateCodeFont, this.ValidateCodeSize, FontStyle.Bold);
      Brush brush = new SolidBrush(this.DrawColor);
      int maxValue = (int) Math.Max((float) ((this.ImageHeight - this.ValidateCodeSize) - 3f), (float) 2f);
      Random random = new Random();
      for (int i = 0; i < this.TruevalidateCodeCount; i++)
      {
 int[] numArray = new int[] { (((int) (i * this.ValidateCodeSize)) + random.Next(1)) + 3, random.Next(maxValue) };
 Point point = new Point(numArray[0], numArray[1]);
 if (this.FontTextRenderingHint)
 {
   graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
 }
 else
 {
   graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
 }
 graphics.DrawString(chArray[i].ToString(), font, brush, (PointF) point);
      }
      graphics.Dispose();
    }

    private void CreateImageGif()
    {
      AnimatedGifEncoder encoder = new AnimatedGifEncoder();
      MemoryStream stream = new MemoryStream();
      encoder.Start();
      encoder.SetDelay(5);
      encoder.SetRepeat(0);
      for (int i = 0; i < 10; i++)
      {
 Bitmap bitmap;
 this.CreateImageBmp(out bitmap);
 this.DisposeImageBmp(ref bitmap);
 bitmap.Save(stream, ImageFormat.Png);
 encoder.Addframe(Image.FromStream(stream));
 stream = new MemoryStream();
      }
      encoder.OutPut(ref stream);
      HttpContext.Current.Response.ClearContent();
      HttpContext.Current.Response.ContentType = "image/Gif";
      HttpContext.Current.Response.BinaryWrite(stream.ToArray());
      stream.Close();
      stream.Dispose();
    }

    private void Createvalidate()
    {
      this.ValidateCode = "";
      string[] strArray = this.AllChar.Split(new char[] { ',' });
      int index = -1;
      Random random = new Random();
      for (int i = 0; i < this.ValidateCodeCount; i++)
      {
 if (index != -1)
 {
   random = new Random((i * index) * ((int) DateTime.Now.Ticks));
 }
 int num3 = random.Next(0x23);
 if (index == num3)
 {
   this.Createvalidate();
 }
 index = num3;
 this.ValidateCode = this.ValidateCode + strArray[index];
      }
      if (this.ValidateCode.Length > this.TruevalidateCodeCount)
      {
 this.ValidateCode = this.ValidateCode.Remove(this.TruevalidateCodeCount);
      }
    }

    private void DisposeImageBmp(ref Bitmap Imageframe)
    {
      Graphics graphics = Graphics.FromImage(Imageframe);
      Pen pen = new Pen(this.DrawColor, 1f);
      Random random = new Random();
      Point[] pointArray = new Point[2];
      for (int i = 0; i < 15; i++)
      {
 pointArray[0] = new Point(random.Next(Imageframe.Width), random.Next(Imageframe.Height));
 pointArray[1] = new Point(random.Next(Imageframe.Width), random.Next(Imageframe.Height));
 graphics.DrawLine(pen, pointArray[0], pointArray[1]);
      }
      graphics.Dispose();
    }

    public void OutPutValidate(string ValidateCodeSession)
    {
      this.Createvalidate();
      this.CreateImageGif();
      HttpContext.Current.Session[ValidateCodeSession] = this.ValidateCode;
    }

    public byte ValidateCodeCount
    {
      get
      {
 return this.TruevalidateCodeCount;
      }
      set
      {
 if (value > 4)
 {
   this.TruevalidateCodeCount = value;
 }
      }
    }
  }

验证码效果:       -----下载源码-----

以上就是实现ASP.NET的全部过程,还附有源码,希望可以帮到大家更好地了解ASP.NET验证码的生成方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/56750.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号