静幽谷原创 作者:李武剑 如转载请注明来处,谢谢。
首先在网上找了很多资料,但是发现很多根本不能用,各种各样的错误出现了
好多是引用不全,还有版本不同,所以决定自己改一个试一下,效果还过得去,呵呵实用就好。
不多说了介绍程序:
下面是生成图片页面的代码,新建一个文件,比如:ValidataImage.aspx 拷入下面代码即可。
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;
using
System.Drawing.Imaging;
using
System.Text;
using
System.IO;
public
partial
class
ValidateImage : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
if
(Session[
"
checkValidate
"
]
!=
null
) //这里要判断session的值是不是为空,如果直接用session["checkValidate"].ToString 的话就会出错。
{
this
.ValidateCode(Session[
"
checkValidate
"
].ToString());
}
else
{
Response.Write(
"
未收到参数!
"
);
}
}
private
void
ValidateCode(
string
VNum)
{
Bitmap Img
=
null
;
Graphics g
=
null
;
MemoryStream ms
=
null
;
int
gheight
=
VNum.Length
*
16
;
Img
=
new
Bitmap(gheight,
22
);
g
=
Graphics.FromImage(Img);
//
背景颜色
g.Clear(Color.White);
//
文字字体
Font f
=
new
Font(
"
Arial Black
"
,
13
, System.Drawing.FontStyle.Italic);
//
文字颜色
SolidBrush s
=
new
SolidBrush(Color.Gray);
g.DrawString(VNum, f, s,
1
,
-
1
);
//
画噪点,这个是偶改的,这里加一些随机的图案避免软件识别,你可以改的更好哦,for语句中的60是噪点的数量 ,拟可以随便加,而且你可以在这里画线,画园,用的是计算机型学的一些知识,我也是现学现用,后面一个注释掉的是画线的方法,呵呵。
Pen blackPen
=
new
Pen(Color.Silver,
0
);
Random rand
=
new
Random();
for
(
int
i
=
0
; i
<
60
; i
++
)
{
int
x
=
rand.Next(Img.Width);
int
y
=
rand.Next(Img.Height);
//
g.DrawLine(blackPen, 0, y,Img.Width, y);
g.DrawEllipse(blackPen, x, y,
1
,
1
); //g.DrawElipse() 是画圆的方法,把生成图片的高度和宽度随机出坐标画一个点。
}
ms
=
new
MemoryStream();
Img.Save(ms, ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType
=
"
image/Jpeg
"
;
Response.BinaryWrite(ms.ToArray());
g.Dispose(); //释放资源别忘了
Img.Dispose();
Response.End();
}
}
然后,在登录页面中,插入如下代码:
private string RndNum(int VcodeNum)
{
string Vchar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P" +
",Q,R,S,T,U,V,W,X,Y,Z";
string[] VcArray = Vchar.Split(new Char[] { ',' });
string VNum = "";
int temp = -1;
Random rand = new Random();
for (int i = 1; i < VcodeNum + 1; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if (temp != -1 && temp == t)
{
return RndNum(VcodeNum);
}
temp = t;
VNum += VcArray[t];
}
return VNum;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack) //这里这个一定要加哦,不加的话,你点提交后session的值就又变了。
{
string checkValidate = RndNum(4);
Session["checkValidate"] = checkValidate;
}
} 下面代码,一个过程是用来产生随机数的,下面一个是Page_Load不用介绍了吧。
效果如下:
判断验证码就不用我来加了吧,Session["checkValidata"].ToString 跟你输入的text进行比较吧。
asp.net2.0下调试通过。
posted on 2007-01-08 15:18
影子 阅读(119)
评论(0) 编辑 收藏 所属分类:
学习笔记