欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-20 20:24:10
12306网站推出“彩色动态验证码机制”,新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼“看不清”,称“那个验证码,是毕加索的抽象画么!”铁总客服则表示:为了能正常...

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;
        }
      }
    }
  }

验证码效果:12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)       -----下载源码-----

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

上一篇:

下一篇: