C#图片验证码
1 using System;
2 using System.Collections;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Web;
7 using System.Web.SessionState;
8 using System.Web.UI;
9 using System.Web.UI.WebControls;
10 using System.Web.UI.HtmlControls;
11 using System.IO;
12 namespace PR.t_img
13 {
14 /// <summary>
15 /// CreateImg 的摘要说明。
16 /// </summary>
17 public class CreateImg : System.Web.UI.Page
18 {
19 private void Page_Load(object sender, System.EventArgs e)
20 {
21 // 在此处放置用户代码以初始化页面
22 string vnum;
23 vnum = GetByRndNum(6);
24 Response.ClearContent(); //需要输出图象信息 要修改HTTP头
25 Response.ContentType="image/Png";
26 Response.BinaryWrite(GetByValidateCode(vnum).ToArray());
27
28 }
29 public MemoryStream GetByValidateCode(string VNum)//返回内存流
30 {
31 Bitmap Img = null;
32 Graphics g = null ;
33 MemoryStream ms = null ;
34 Random random = new Random();
35 int gheight = VNum.Length*12;
36 Img = new Bitmap(gheight,24);
37 g = Graphics.FromImage(Img);
38 Font f = new Font("Arial", 12, FontStyle.Bold);
39
40 g.Clear (GetByRandColor(204,255) );//设定背景色
41 Pen blackPen = new Pen(Color.Ivory ,3);
42 for (int i=0;i<155;i++)// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
43 {
44 int x = random.Next (gheight);
45 int y = random.Next (20);
46 int xl = random.Next (6);
47 int yl = random.Next (2);
48 g.DrawLine (blackPen,x,y,x+xl,y+yl);
49 }
50 SolidBrush s = new SolidBrush(Color.SandyBrown);
51 g.DrawString(VNum,f,s,3,3);
52 ms=new MemoryStream();
53 Img.Save(ms,System.Drawing.Imaging.ImageFormat.Png);
54 g.Dispose();
55 Img.Dispose();
56 return ms;
57 }
58 //-----------------给定范围获得随机颜色------------
59 Color GetByRandColor(int fc,int bc)
60 {
61 Random random = new Random();
62
63 if(fc>255) fc=255;
64 if(bc>255) bc=255;
65 //if(ac>255) ac=255;
66 int r=fc+random.Next (bc-fc);
67 int g=fc+random.Next (bc-fc);
68 int b=fc+random.Next (bc-bc);
69 Color rs = Color.FromArgb (r,g,b);
70 return rs;
71 }
72
73 //-----------------------取随机产生的认证码(6位数字)
74 public string GetByRndNum(int VcodeNum)
75 {
76 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,w,x,y,z" ;
77 string[] VcArray = Vchar.Split(',') ;
78 string VNum = "" ;
79 int temp = -1 ;//记录上次随机数值,尽量避免生产几个一样的随机数
80 //采用一个简单的算法以保证生成随机数的不同
81 Random rand =new Random();
82 for ( int i = 1 ; i < VcodeNum+1 ; i++ )
83 {
84 if ( temp != -1)
85 {
86 rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));
87 }
88 int t = rand.Next(35) ;
89 if (temp != -1 && temp == t)
90 {
91 return GetByRndNum( VcodeNum );
92 }
93 temp = t ;
94 VNum += VcArray[t];
95 }
96 return VNum ;
97 }
98
99 #region Web 窗体设计器生成的代码
100 override protected void OnInit(EventArgs e)
101 {
102 //
103 // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
104 //
105 InitializeComponent();
106 base.OnInit(e);
107 }
108
109 /// <summary>
110 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
111 /// 此方法的内容。
112 /// </summary>
113 private void InitializeComponent()
114 {
115 this.Load += new System.EventHandler(this.Page_Load);
116 }
117 #endregion
118 }
119 }
2 using System.Collections;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Web;
7 using System.Web.SessionState;
8 using System.Web.UI;
9 using System.Web.UI.WebControls;
10 using System.Web.UI.HtmlControls;
11 using System.IO;
12 namespace PR.t_img
13 {
14 /// <summary>
15 /// CreateImg 的摘要说明。
16 /// </summary>
17 public class CreateImg : System.Web.UI.Page
18 {
19 private void Page_Load(object sender, System.EventArgs e)
20 {
21 // 在此处放置用户代码以初始化页面
22 string vnum;
23 vnum = GetByRndNum(6);
24 Response.ClearContent(); //需要输出图象信息 要修改HTTP头
25 Response.ContentType="image/Png";
26 Response.BinaryWrite(GetByValidateCode(vnum).ToArray());
27
28 }
29 public MemoryStream GetByValidateCode(string VNum)//返回内存流
30 {
31 Bitmap Img = null;
32 Graphics g = null ;
33 MemoryStream ms = null ;
34 Random random = new Random();
35 int gheight = VNum.Length*12;
36 Img = new Bitmap(gheight,24);
37 g = Graphics.FromImage(Img);
38 Font f = new Font("Arial", 12, FontStyle.Bold);
39
40 g.Clear (GetByRandColor(204,255) );//设定背景色
41 Pen blackPen = new Pen(Color.Ivory ,3);
42 for (int i=0;i<155;i++)// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
43 {
44 int x = random.Next (gheight);
45 int y = random.Next (20);
46 int xl = random.Next (6);
47 int yl = random.Next (2);
48 g.DrawLine (blackPen,x,y,x+xl,y+yl);
49 }
50 SolidBrush s = new SolidBrush(Color.SandyBrown);
51 g.DrawString(VNum,f,s,3,3);
52 ms=new MemoryStream();
53 Img.Save(ms,System.Drawing.Imaging.ImageFormat.Png);
54 g.Dispose();
55 Img.Dispose();
56 return ms;
57 }
58 //-----------------给定范围获得随机颜色------------
59 Color GetByRandColor(int fc,int bc)
60 {
61 Random random = new Random();
62
63 if(fc>255) fc=255;
64 if(bc>255) bc=255;
65 //if(ac>255) ac=255;
66 int r=fc+random.Next (bc-fc);
67 int g=fc+random.Next (bc-fc);
68 int b=fc+random.Next (bc-bc);
69 Color rs = Color.FromArgb (r,g,b);
70 return rs;
71 }
72
73 //-----------------------取随机产生的认证码(6位数字)
74 public string GetByRndNum(int VcodeNum)
75 {
76 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,w,x,y,z" ;
77 string[] VcArray = Vchar.Split(',') ;
78 string VNum = "" ;
79 int temp = -1 ;//记录上次随机数值,尽量避免生产几个一样的随机数
80 //采用一个简单的算法以保证生成随机数的不同
81 Random rand =new Random();
82 for ( int i = 1 ; i < VcodeNum+1 ; i++ )
83 {
84 if ( temp != -1)
85 {
86 rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));
87 }
88 int t = rand.Next(35) ;
89 if (temp != -1 && temp == t)
90 {
91 return GetByRndNum( VcodeNum );
92 }
93 temp = t ;
94 VNum += VcArray[t];
95 }
96 return VNum ;
97 }
98
99 #region Web 窗体设计器生成的代码
100 override protected void OnInit(EventArgs e)
101 {
102 //
103 // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
104 //
105 InitializeComponent();
106 base.OnInit(e);
107 }
108
109 /// <summary>
110 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
111 /// 此方法的内容。
112 /// </summary>
113 private void InitializeComponent()
114 {
115 this.Load += new System.EventHandler(this.Page_Load);
116 }
117 #endregion
118 }
119 }