C#生成汉字验证码的方法
首先,我们需要用到Graphics对象与Encoding对象,所以,应该在添加下列引用:
using System.Text;
using System.Drawing;
先写一个方法CreateStringCode,用于获得汉字的4位区位码:
CreateStringCode.cs
1 private object[] CreateStringCode(int strLength)
2 {
3 //定义一个数组存储汉字编码的组成元素
4 string[] str = new string[16] {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f" };
5 Random rand = new Random();
6 object[] objects = new object[strLength];
7 for (int i = 0; i < strLength; i++)
8 {
9 //获取区位码第一位,汉字在第16区B0开始,所以随机生成的汉字的区位码第一位在B、C、D之间
10 int code1 = rand.Next(11, 14);
11 string str1 = str[code1].Trim();
12
13 rand = new Random();
14 int code2;
15 //如果取到的第一位验证码为d,那么第二位验证码只能在0-6中取,因为D7之后都是些繁杂汉字
16 if(code1 == 13)
17 code2 = rand.Next(0,7);
18 else
19 code2 = rand.Next(0,16);
20 string str2 = str[code2].Trim();
21
22 //获取区位码第三位
23 rand= new Random(code2 * unchecked((int)DateTime.Now.Ticks) + i);
24 int code3= rand.Next(10,16);
25 string str3 = str[code3].Trim();
26
27 //获取区位码第四位
28 //区位码表每区的第一个位置和最后一个位置都是空的,没有汉字,
29 //因此随机生成的区位码第3位如果是A的话,第4位就不能是0;第3位如果是F的话,第4位就不能是F。
30 rand = new Random(code3 * unchecked((int)DateTime.Now.Ticks)+ i);
31 int code4;
32 if(code3 == 10)
33 code4 = rand.Next(1,16);
34 else if(code3 == 13)
35 code4= rand.Next(0,15);
36 else
37 code4 = rand.Next(0,16);
38 string str4 = str[code4].Trim();
39
40 byte byte1 = Convert.ToByte(str1 + str2,16);
41 byte byte2 = Convert.ToByte(str3 + str4, 16);
42 byte[] strAdd = new byte[] {byte1,byte2 };
43
44 objects.SetValue(strAdd, i);
45 }
46 return objects;
47 }
48
49
然后编写方法getString,将得到的汉字编码转换为汉字:
getString
1 private string getString(int length)
2 {
3 Encoding gb = Encoding.GetEncoding("gb2312");
4 object[] bytes = CreateStringCode(length);
5
6 string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
7 string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
8 string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
9 string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
10
11 string str = str1 + " " + str2 + str3 + str4;
12
13 return str;
14 }
编写方法GraphicsImage,在页面中画出所生成的汉字:
GraphicsImage.cs
private void GraphicsImage(int Length)
{
//生成Bitmap对象
System.Drawing.Bitmap image =
new System.Drawing.Bitmap((int)Math.Ceiling((getString(Length).Length * 32.5)),42);
Graphics g = Graphics.FromImage(image);
try
{
Random rand = new Random();
//设置背景色
g.Clear(Color.White);
//画两条噪音线
for (int i = 0; i < 2; i++)
{
int x1 = rand.Next(image.Width);
int x2 = rand.Next(image.Width);
int y1 = rand.Next(image.Height);
int y2 = rand.Next(image.Height);
g.DrawLine(new Pen(Color.FromArgb(rand.Next())), x1, y1, x2, y2);
}
//生成字体对象,设置字体
Font font = new System.Drawing.Font("黑体", 24, System.Drawing.FontStyle.Bold);
//设置字体的颜色,纹路,渐变等
System.Drawing.Drawing2D.LinearGradientBrush brush =
new System.Drawing.Drawing2D.LinearGradientBrush(
new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Red, 1.2f, true);
g.DrawString(getString(Length), font, brush, 2, 2);
//在图片上生成1000个噪音点
for (int i = 0; i < 1000; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(rand.Next()));
}
//画出边框
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
//保存,格式为Gif
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());
}
catch (Exception ms)
{
Response.Write(ms.Message);
}
}
最后在页面的Page_Load事件中调用一下:
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 GraphicsImage(4);
4 }
5
6
效果如下图所示:

posted on 2010-12-27 14:39 DilibraLee 阅读(245) 评论(0) 收藏 举报

浙公网安备 33010602011771号