asp.net下中文验证码,免费开源代码

  using System;

  using System.Data;

  using System.Configuration;

  using System.Collections;

  using System.Web;

  using System.Web.Security;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  using System.Web.UI.WebControls.WebParts;

  using System.Web.UI.HtmlControls;

  using System.Text;

  using System.Drawing;

  public partial class CnCode : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  //获取GB2312编码页(表)

  Encoding gb = Encoding.GetEncoding("gb2312");

  //调用函数产生4个随机中文汉字编码

  object[] bytes = CreateRegionCode(4);

  //根据汉字编码的字节数组解码出中文汉字

  string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));

  string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));

  string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));

  string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));

  //输出的控制台

  CreateImage(str1 + str2 + str3 + str4);

  }

  /*

  此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将

  四个字节数组存储在object数组中。

  参数:strlength,代表需要产生的汉字个数

  */

  public static object[] CreateRegionCode(int strlength)

  {

  //定义一个字符串数组储存汉字编码的组成元素

  string[] rBase=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};

  Random rnd=new Random();

  //定义一个object数组用来

  object[] bytes=new object[strlength];

  /**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中

  每个汉字有四个区位码组成

  区位码第1位和区位码第2位作为字节数组第一个元素

  区位码第3位和区位码第4位作为字节数组第二个元素

  */

  for(int i=0;i<strlength;i++)

  {

  //区位码第1位

  int r1=rnd.Next(11,14);

  string str_r1=rBase[r1].Trim();

  //区位码第2位

  rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的种子避免产生重复值

  int r2;

  if (r1==13)

  {

  r2=rnd.Next(0,7);

  }

  else

  {

  r2=rnd.Next(0,16);

  }

  string str_r2=rBase[r2].Trim();

  //区位码第3位

  rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i);

  int r3=rnd.Next(10,16);

  string str_r3=rBase[r3].Trim();

  //区位码第4位

  rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i);

  int r4;

  if (r3==10)

  {

  r4=rnd.Next(1,16);

  }

  else if (r3==15)

  {

  r4=rnd.Next(0,15);

  }

  else

  {

  r4=rnd.Next(0,16);

  }

  string str_r4=rBase[r4].Trim();

  //定义两个字节变量存储产生的随机汉字区位码

  byte byte1=Convert.ToByte(str_r1 + str_r2,16);

  byte byte2=Convert.ToByte(str_r3 + str_r4,16);

  //将两个字节变量存储在字节数组中

  byte[] str_r=new byte[]{byte1,byte2};

  //将产生的一个汉字的字节数组放入object数组中

  bytes.SetValue(str_r,i);

  }

  return bytes;

  }

  private void CreateImage(string checkCode)

  {

  int iwidth = (int)(checkCode.Length * 25);

  System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);

  Graphics g = Graphics.FromImage(image);

  Font f = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Bold);

  Brush b = new System.Drawing.SolidBrush(Color.White);

  //g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);

  g.Clear(Color.Blue);

  g.DrawString(checkCode, f, b, 3, 3);

  Pen blackPen = new Pen(Color.Black, 0);

  Random rand = new Random();

  for (int i = 0; i < 4; i++)

  {

  int y = rand.Next(image.Height);

  g.DrawLine(blackPen, 0, y, image.Width, y);

  }

  System.IO.MemoryStream ms = new System.IO.MemoryStream();

  image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

  Response.ClearContent();

  Response.ContentType = "image/png";

  Response.BinaryWrite(ms.ToArray());

  g.Dispose();

  image.Dispose();

  }

  }

  该文章转载自'大智の博客':http://www.csafe.cn/article.asp?id=1274