如何生成汉字验证码或字母数字混合验证码
2014-12-02 09:07
501 查看
如何生成汉字验证码
生成字母与数字混合验证码
这两段代码生成图片的函数是一样的
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; using System.Data; using System.Text; public partial class ValidateNum : System.Web.UI.Page { //生成纯汉字验证码 public void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //获取GB2312编码页(表) Encoding gb = Encoding.GetEncoding("gb2312"); //调用函数产生4个随机中文汉字编码 object[] bytes = CreateRegionCode(6); //根据汉字编码的字节数组解码出中文汉字 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[]))); Session["ValidateNum"] = 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 validateNum) { if (validateNum == null || validateNum.Trim() == String.Empty) return; //生成BitMap图像 Bitmap image = new Bitmap(validateNum.Length*12+40,24); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景颜色 g.Clear(Color.White); //画图片的背景噪音线 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Silver), x1, x2, y1, y2); } Font font = new Font("Arial",12,(FontStyle.Bold | FontStyle.Italic)); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.
LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(validateNum, font, brush, 2, 2); //画图片的前景噪音点 for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width-1,image.Height-1); System.IO.MemoryStream ms =new System.IO.MemoryStream(); //将图像保存到指定的流 image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } }
生成字母与数字混合验证码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; using System.Data; using System.Text; public partial class ValidateNum : System.Web.UI.Page { 生成数字+字母混合验证码 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string validateNum = CreateRandomNum(4) ;//生成4个随机字符串 CreateImage(validateNum);//将生成的随机字符串绘成图片 Session["ValidateNum"] = validateNum;//保存验证码 } } //随机生成数字+字母字符串 private string CreateRandomNum(int NumCount) { string allChar = "2,3,4,5,6,7,8,9,A,B,C,D,F,G,H,J,K,L,Q,W,E,R,T,Y,U,I,O,P,Z,X,C,V,B,N,M"; string[] allCharArray = allChar.Split(',');//拆分成组 string randomNum = ""; int temp = -1; //记录上次随机数的数值,尽量避免产生几个相同的随机数 Random rand = new Random(); for (int i = 0; i < NumCount; i++) { if (temp !=-1) { rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); } int t = rand.Next(35); if (temp==t) { return CreateRandomNum(NumCount); } temp = t; randomNum += allCharArray[t]; } return randomNum; } //生成图片 private void CreateImage(string validateNum) { if (validateNum == null || validateNum.Trim() == String.Empty) return; //生成BitMap图像 Bitmap image = new Bitmap(validateNum.Length*12+40,24); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景颜色 g.Clear(Color.White); //画图片的背景噪音线 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Silver), x1, x2, y1, y2); } Font font = new Font("Arial",12,(FontStyle.Bold | FontStyle.Italic)); System.Drawing.Drawing2D.LinearGradientBrush brush =
new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,
0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(validateNum, font, brush, 2, 2); //画图片的前景噪音点 for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width-1,image.Height-1); System.IO.MemoryStream ms =new System.IO.MemoryStream(); //将图像保存到指定的流 image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } }
这两段代码生成图片的函数是一样的
相关文章推荐
- ava验证码中的数字、字母、汉字如何随机生成
- java验证码中的数字、字母、汉字如何随机生成
- java验证码中的数字、字母、汉字如何随机生成
- 验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母/数字/汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母/数字/汉字混合]
- asp.net生成字母和数字混合图形验证码
- 验证码生成器类,可生成数字、大写、小写、图片字母及三者混合类型的验证码
- 使用 Python 生成类数字字母混合验证码图片
- 验证码的三种做法[纯数字][纯汉字][字母/数字/汉字混合]C#
- 转:验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合] C#
- 验证码的三种做法[纯数字][纯汉字][字母/数字/汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母/数字/汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母/数字/汉字混合]C#
- 验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合]C#
- 生成验证码(数字字母混合)
- asp.net 生成图形验证码(字母和数字混合)