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 }

 

posted @ 2010-04-28 16:48  海军  阅读(407)  评论(0编辑  收藏  举报