参考了一些例子做了个简单的生成验证码的类,代码如下

ValidateCode.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Web;
5
using System.Drawing;
6
using System.IO;
7
using System.Drawing.Imaging;
8
9
namespace WEBQQ
10

{
11
public class ValidateCode
12
{
13
private string GetRandom(int num)
14
{
15
Random r = new Random(unchecked((int) DateTime.Now.Ticks));
16
string vstr="";
17
string code = "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,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";
18
string[] array = code.Split(new char[]
{ ',' });
19
for (int i = 0; i < num; i++)
20
vstr += array[r.Next(0, 52)];
21
return vstr;
22
}
23
24
public MemoryStream CreateGif(out string vnum)
25
{
26
vnum = GetRandom(4);
27
28
Bitmap img;
29
Graphics g;
30
MemoryStream ms;
31
Random r = new Random(DateTime.Now.Second);
32
Color[] c =
{ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Purple, Color.Brown };
33
string[] fonts =
{ "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
34
35
img = new Bitmap(vnum.Length * 18, 24);
36
g = Graphics.FromImage(img);
37
g.FillRectangle(new SolidBrush(Color.White),0,0, vnum.Length * 18, 24);
38
39
40
g.DrawString(vnum, new Font("宋体", 13, FontStyle.Bold), new SolidBrush(Color.White), new PointF(5, 2));
41
for (int i = 0; i < 100; i++)//画随机点
42
{
43
int x = r.Next(img.Width);
44
int y = r.Next(img.Height);
45
g.DrawRectangle(new Pen(Color.LightGray), x, y, 1, 1);
46
}
47
for (int i = 0; i < vnum.Length; i++)
48
{
49
int cindex = r.Next(7);
50
int findex = r.Next(5);
51
Font f = new Font(fonts[findex], 13, FontStyle.Bold);
52
Brush b = new SolidBrush(c[cindex]);
53
int y = 4;
54
if ((i + 1) % 2 == 0)
55
y = 2;
56
57
g.DrawString(vnum.Substring(i, 1), f, b, 3 + i * 12,y);
58
59
}
60
g.DrawLine(new Pen(new SolidBrush(c[r.Next(7)])), new Point(3, r.Next(3, 24)), new Point(vnum.Length * 18 - 3, r.Next(3, 24)));
61
62
ms = new MemoryStream();
63
img.Save(ms, ImageFormat.Gif);
64
g.Dispose();
65
img.Dispose();
66
return ms;
67
68
}
69
70
71
}
72
}
73
接下来还是httphandler,创建一个一般处理程序getGif.ashx,getgif.ashx.cs代码如下

getGif.ashx.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Web;
5
using System.IO;
6
7
namespace WEBQQ
8

{
9
/**//// <summary>
10
/// $codebehindclassname$ 的摘要说明
11
/// </summary>
12
public class getGif : IHttpHandler,System.Web.SessionState.IRequiresSessionState
13
{
14
15
public void ProcessRequest(HttpContext context)
16
{
17
18
ValidateCode gif = new ValidateCode();
19
string valnum="";
20
MemoryStream ms = gif.CreateGif(out valnum);
21
context.Session.Add("valnum", valnum);
22
23
context.Response.ContentType = "image/gif";
24
context.Response.BinaryWrite(ms.ToArray ());
25
context.Response.End();
26
}
27
28
public bool IsReusable
29
{
30
get
31
{
32
return false;
33
}
34
}
35
}
36
}
37
刚开始的时候我是使用context.Response.Write(ms.ToArray()),结果是看不到图片,所以需要用context.Response.BinaryWrite(ms.ToArray())才行
然后在页面内添加一个<img src="getGif.ashx" onclick="return change_img()">
<script>
function change_img() {
document.getElementById("valcode").src += "?getGif.ashx";
}
</script>
不知道图片src为什么要用+=来赋值,还有加一个?号??????