1
using System;
2
using System.Drawing;
3
using System.Drawing.Imaging;
4
using System.Web.UI;
5
using System.Drawing.Drawing2D;
6
using System.IO;
7
namespace Validate
8

{
9
/**//// <summary>
10
/// 生成验证码的类
11
/// </summary>
12
public class ValidateNumber
13
{
14
public ValidateNumber()
15
{
16
}
17
/**//// <summary>
18
/// 验证码的最大长度
19
/// </summary>
20
public int MaxLength
21
{
22
get
{return 10;}
23
}
24
/**//// <summary>
25
/// 验证码的最小长度
26
/// </summary>
27
public int MinLength
28
{
29
get
{return 1;}
30
}
31
/**//// <summary>
32
/// 生成验证码
33
/// </summary>
34
/// <param name="length">指定验证码的长度</param>
35
/// <returns></returns>
36
public string CreateValidateNumber(int length)
37
{
38
int[] randMembers=new int[length];
39
int[] validateNums=new int[length];
40
string validateNumberStr="";
41
//生成起始序列值
42
int seekSeek=unchecked((int)DateTime.Now.Ticks);
43
Random seekRand=new Random(seekSeek);
44
int beginSeek=(int)seekRand.Next(0,Int32.MaxValue-length*10000);
45
int[] seeks=new int[length];
46
for(int i=0;i<length;i++)
47
{
48
beginSeek+=10000;
49
seeks[i]=beginSeek;
50
}
51
//生成随机数字
52
for(int i=0;i<length;i++)
53
{
54
Random rand=new Random(seeks[i]);
55
int pownum=1*(int)Math.Pow(10,length);
56
randMembers[i]=rand.Next(pownum,Int32.MaxValue);
57
}
58
//抽取随机数字
59
for(int i=0;i<length;i++)
60
{
61
string numStr=randMembers[i].ToString();
62
int numLength=numStr.Length;
63
Random rand=new Random();
64
int numPosition=rand.Next(0,numLength-1);
65
validateNums[i]=Int32.Parse(numStr.Substring(numPosition,1));
66
}
67
//生成验证码
68
for(int i=0;i<length;i++)
69
{
70
validateNumberStr+=validateNums[i].ToString();
71
}
72
return validateNumberStr;
73
}
74
/**//// <summary>
75
/// 创建验证码的图片
76
/// </summary>
77
/// <param name="containsPage">要输出到的page对象</param>
78
/// <param name="validateNum">验证码</param>
79
public void CreateValidateGraphic(Page containsPage,string validateNum)
80
{
81
Bitmap image=new Bitmap((int)Math.Ceiling(validateNum.Length*12.5),22);
82
Graphics g=Graphics.FromImage(image);
83
try
84
{
85
//生成随机生成器
86
Random random=new Random();
87
//清空图片背景色
88
g.Clear(Color.White);
89
//画图片的干扰线
90
for(int i=0;i<25;i++)
91
{
92
int x1=random.Next(image.Width);
93
int x2=random.Next(image.Width);
94
int y1=random.Next(image.Height);
95
int y2=random.Next(image.Height);
96
g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
97
}
98
Font font=new Font("Arial",12,(FontStyle.Bold|FontStyle.Italic));
99
LinearGradientBrush brush=new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),
100
Color.Blue,Color.DarkRed,1.2f,true);
101
g.DrawString(validateNum,font,brush,3,2);
102
//画图片的前景干扰点
103
for(int i=0;i<100;i++)
104
{
105
int x=random.Next(image.Width);
106
int y=random.Next(image.Height);
107
image.SetPixel(x,y,Color.FromArgb(random.Next()));
108
}
109
//画图片的边框线
110
g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width-1,image.Height-1);
111
//保存图片数据
112
MemoryStream stream=new MemoryStream();
113
image.Save(stream,ImageFormat.Jpeg);
114
//输出图片
115
containsPage.Response.Clear();
116
containsPage.Response.ContentType="image/jpeg";
117
containsPage.Response.BinaryWrite(stream.ToArray());
118
}
119
finally
120
{
121
g.Dispose();
122
image.Dispose();
123
}
124
}
125
/**//// <summary>
126
/// 得到验证码图片的长度
127
/// </summary>
128
/// <param name="validateNumLength">验证码的长度</param>
129
/// <returns></returns>
130
public static int GetImageWidth(int validateNumLength)
131
{
132
return (int)(validateNumLength*12.5);
133
}
134
/**//// <summary>
135
/// 得到验证码的高度
136
/// </summary>
137
/// <returns></returns>
138
public static double GetImageHeight()
139
{
140
return 22.5;
141
}
142
}
143
}
144
145
146

2

3

4

5

6

7

8



9


10

11

12

13



14

15



16

17


18

19

20

21



22



23

24


25

26

27

28



29



30

31


32

33

34

35

36

37



38

39

40

41

42

43

44

45

46

47



48

49

50

51

52

53



54

55

56

57

58

59

60



61

62

63

64

65

66

67

68

69



70

71

72

73

74


75

76

77

78

79

80



81

82

83

84



85

86

87

88

89

90

91



92

93

94

95

96

97

98

99

100

101

102

103

104



105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120



121

122

123

124

125


126

127

128

129

130

131



132

133

134


135

136

137

138

139



140

141

142

143

144

145

146
