你的位置:首页 > ASP.net教程

[ASP.net教程]一个简单的彩色背景图形验证码


首先需要添加的命名空间

using System.Web.UI.WebControls;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

 

编写一个生成随机数的方法,此方法很简单,返回的是一个字符串也就是需要显示到验证码中的字符串,Random 类是伪随机数生成器,可以根据自定义的任何字符串生成指定长度的字符串。详情请参照 https://msdn.microsoft.com/zh-cn/library/system.random.aspx

//获取随机数,调用该方法的一个参数是指定返回的字符串的长度
private string GetRandString(int len)
{
  string s = "0123456789zxcbvnmasdfghjklpoiuyrtewqQWERTYUIOPLKJHGFDSAXZCVNBM";
  string str = "";
  Random r = new Random();
  for (int i = 0; i < len; i++)
  {
    str += s.Substring(r.Next(s.Length), 1);
  }
  return str;
}

好了,随机生成的字符串已经有了,接下来就是以图形的方式显示

这里可以直接写到Load事件里面,也可以把实现的过程封装起来(写成一个类)以方便重用,我这里就直接写到Load加载事件里面了

protected void Page_Load(object sender, EventArgs e)
{

  Random rand = new Random();

  //获取随机字符
  string str = GetRandString(5);

  //创建画板
  Bitmap image = new Bitmap(100, 30);
  Graphics g = Graphics.FromImage(image);
  g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
  g.SmoothingMode = SmoothingMode.AntiAlias;

  //绘制渐变背景
  Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
  Brush brushBack = new LinearGradientBrush(rect, Color.FromArgb(rand.Next(150, 256), 255, 255),
  Color.FromArgb(255, rand.Next(150, 256), 255), rand.Next(90));
  g.FillRectangle(brushBack, rect);

  

  //绘制干扰曲线
  for (int i = 0; i < 2; i++)
  {
    Point p1 = new Point(0, rand.Next(image.Height));
    Point p2 = new Point(rand.Next(image.Width), rand.Next(image.Height));
    Point p3 = new Point(rand.Next(image.Width), rand.Next(image.Height));
    Point p4 = new Point(image.Width, rand.Next(image.Height));
    Point[] p = { p1, p2, p3, p4 };
    Pen pen = new Pen(Color.Gray, 1);
    g.DrawBeziers(pen, p);
  }

  

  //逐个绘制文字
  for (int i = 0; i < str.Length; i++)
  {
    string strChar = str.Substring(i, 1);
    int deg = rand.Next(-15, 15);
    float x = (image.Width / str.Length / 2) + (image.Width / str.Length) * i;
    float y = image.Height / 2;
    //随机字体大小
    Font font = new Font("Consolas", rand.Next(16, 24), FontStyle.Regular);
    SizeF size = g.MeasureString(strChar, font);
    Matrix m = new Matrix();
    //旋转
    m.RotateAt(deg, new PointF(x, y), MatrixOrder.Append);
    //扭曲
    m.Shear(rand.Next(-10, 10) * 0.03f, 0);
    g.Transform = m;
    //随机渐变画笔
    Brush brushPen = new LinearGradientBrush(rect, Color.FromArgb(rand.Next(0, 256), 0, 0), Color.FromArgb(0, 0, rand.Next(0, 256)),     rand.Next(90));
    g.DrawString(str.Substring(i, 1), font, brushPen, new PointF(x - size.Width / 2, y - size.Height / 2));

    g.Transform = new Matrix();
  }

  g.Save();
  Response.ContentType = "image/jpeg";
  Response.Clear();
  Response.BufferOutput = true;
  image.Save(Response.OutputStream, ImageFormat.Jpeg);

  //释放使用的资源
  g.Dispose();
  image.Dispose();
  Response.Flush();

}

执行结果

 

这里只实现了一个简单的图形验证码,我这里只做了两条干扰线,其实还可以做的更逼真更复杂一些,例如可以在背景上面再添加一些噪音点之类的,使字体不显示的不这么明显,从而进行干扰字体。。。。。

当然这里还只是一个显示的图形而已,你的目的肯定是还有一个文本框的,那么怎么判断输入的验证码是否正确呢,验证码都出来了,验证就简单了,GetRandString(int len)方法返回的是不是就是随机生成的图形验证码里面的字符串,只要拿该方法返回的字符串和文本框里面的内存进行比较就知道输入的验证码对不对了。。。。