今天做了几个例子,是关于验证码的,其实验证码不难,你只要理解它的组成,就能学明白了。看了几个例子发现了验证码其实就是一个页面。比如我们有两个页 面,code.aspx和png.aspx,这里我们假设code就是所谓我们发帖的地方,在此页面我们放个image控件,
<asp:Image ID="Image1" runat="server" ImageUrl="png.aspx" />
这里我们发现什么了呢?
很简单,就是我们生成随机数和干扰图片都是在一个页面内完成的。做好这个,我们就能往下做了,这里很简单了下面我们就来做一个简单的例子就行了,生成随机汉字的吧。
我们建个网站就叫confirmcode,然后在里面建了连个页面code.aspx和png.aspx。如图
在这里code.aspx我们展示,png的动态生成样式。
我们首先设计png.aspx让其生成一个随机汉字字符串。这里编写了两个方法。
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]; 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 string stxt() { Encoding gb = Encoding.GetEncoding("gb2312"); //调用函数产生4个随机中文汉字编码 object[] bytes = CreateRegionCode(3); //根据汉字编码的字节数组解码出中文汉字 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 txt = str1 + str2 + str3; return txt; }这样我们在该页面的load事件里调用这个方法就可以了
private readonly string ImagePath = "Validator.jpg";
private static string gif = ""; protected void Page_Load(object sender, EventArgs e) { gif = stxt(); ///创建Bmp位图 Bitmap bitMapImage = new System.Drawing.Bitmap(Server.MapPath(ImagePath)); Graphics graphicImage = Graphics.FromImage(bitMapImage); ///设置画笔的输出模式 graphicImage.SmoothingMode = SmoothingMode.HighSpeed; ///添加文本字符串 graphicImage.DrawString(gif, new Font("Georgia", 20, FontStyle.Bold), SystemBrushes.WindowText, new Point(5, 5)); ///设置图像输出的格式 Response.ContentType = "image/jpeg"; ///保存数据流 bitMapImage.Save(Response.OutputStream, ImageFormat.Jpeg); ///释放占用的资源 graphicImage.Dispose(); bitMapImage.Dispose();}