VB .NET 中怎样实现动态验证码
VB .NET中怎样实现类似网页的动态验证功能,但是是单机版的程序仅仅是添加了一个验证功能。不知道哪位高手可以指点一下,感激不尽!
[解决办法]
说实在的,验证码很烦人的,尤其是一些让人看起来费劲的验证码,用户体验不好你还指望别人用啊?
验证码有几种途径,但一般都是画字符。
1、如果简单点的就直接用GRAPHICS的DRAWSTRING方法绘制。。。
2、如果想复杂点可以加一些杂点,设置不同颜色,旋转画布然后绘制(倾斜度),使用不同字体等等
3、如果不想编码太复杂,那么可以用汉字验证码,识别起来要复杂一些,如果你再用不同字体的话。。
如果真的非用验证码不可的话。。。。。个人觉得汉字的比较可取,但还是需要一些加工,例如尽可能不要杂点或者针对二值化设计好杂点颜色,但是倾斜角度可以大,生成验证码的函数就是一个随机函数了,最好控制好范围不然出来不认识的……这样生成的验证码要是都轻松识别,那可以去写一个OCR把清华紫光那个烂OCR挂掉了。
具体来说,编码大概需要这样:
1、确定要N个字符做验证码,以得到验证码图片整体大小(SIZE*1.X)(这里的X是用于缩放和适应不同字体以及旋转倾斜的预留空间,而SIZE可以由绘制最大字符所用对角线长度确定(在GRAPHICS的方法里有可以测试字符绘制所需大小的),当然这个最大所需空间取决于2的生成函数)
2、几个不同的生成函数,每个函数对应一个字符的生成方法(如使用的字体,旋转角度,字颜色和杂点颜色)
3、随机生成两个数字(ASCII),组合成一个汉字(在TEXT空间里面),循环N次,得到N个字符,MD5之以替换这N个字符(就是说用MD5代替字符串了当然其他函数也可以了,只要是11对应关系……原因很简单的)
4、随机调用前面2的生成函数,依次绘制这些字符
5、检测输入字符的MD5与保存值是否一致。
[解决办法]
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.Drawing;
public partial class VerifyCode : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
Session["VerifyCode"] = MakeValidateCode();
CreateImage(Session["VerifyCode"].ToString());
}
private void CreateImage(string checkCode)
{
int iwidth = (int)(checkCode.Length * 12) + 10;
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定义字体
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
Random rand = new Random();
//随机输出噪点
for (int i = 0; i < 5; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
}
//输出不同字体和颜色的验证码字符
for (int i = 0; i < checkCode.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5);
Font f = new System.Drawing.Font("宋体", 12, System.Drawing.FontStyle.Regular);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
int ii = 4;
if ((i + 1) % 2 == 0)
{
ii = 2;
}
g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);
}
//画一个边框
g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
private string MakeValidateCode()
{
//0 i o
char[] s = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
string num = "";
Random r = new Random();
for (int i = 0; i < 4; i++)
{
num += s[r.Next(0, s.Length - 1)].ToString();
}
return num;
}
}