(轉)生成各種類型的驗證碼的類

該類可生成各種類型任意長度的驗證碼:數字,數字,字母,數字與字母,漢字,圖片.

using  System;
using  System.Drawing;
using  System.Drawing.Imaging;
using  System.Web.UI;
using  System.Drawing.Drawing2D;
using  System.IO;
using  System.Text;
namespace  JalisWeb
{
     
///   <summary>
     
///  生成验证码的类
     
///   </summary>
      public   class  ValidateNumber
     {
         
public  ValidateNumber()
         {
         }
         
///   <summary>
         
///  验证码的最大长度
         
///   </summary>
          public   int  MaxLength
         {
             
get  {  return   10 ; }
         }
         
///   <summary>
         
///  验证码的最小长度
         
///   </summary>
          public   int  MinLength
         {
             
get  {  return   1 ; }
         }
         
///   <summary>
         
///  生成验证码
         
///   </summary>
         
///   <param name="length"> 指定验证码的长度 </param>
         
///   <returns></returns>
          public   string  CreateValidateNumber( int  length)
         {
             
int [] randMembers  =   new   int [length];
             
int [] validateNums  =   new   int [length];
             
string  validateNumberStr  =   "" ;
             
// 生成起始序列值
              int  seekSeek  =   unchecked (( int )DateTime.Now.Ticks);
             Random seekRand 
=   new  Random(seekSeek);
             
int  beginSeek  =  ( int )seekRand.Next( 0 , Int32.MaxValue  -  length  *   10000 );
             
int [] seeks  =   new   int [length];
             
for  ( int  i  =   0 ; i  <  length; i ++ )
             {
                 beginSeek 
+=   10000 ;
                 seeks[i] 
=  beginSeek;
             }
             
// 生成随机数字
              for  ( int  i  =   0 ; i  <  length; i ++ )
             {
                 Random rand 
=   new  Random(seeks[i]);
                 
int  pownum  =   1   *  ( int )Math.Pow( 10 , length);
                 randMembers[i] 
=  rand.Next(pownum, Int32.MaxValue);
             }
             
// 抽取随机数字
              for  ( int  i  =   0 ; i  <  length; i ++ )
             {
                 
string  numStr  =  randMembers[i].ToString();
                 
int  numLength  =  numStr.Length;
                 Random rand 
=   new  Random();
                 
int  numPosition  =  rand.Next( 0 , numLength  -   1 );
                 validateNums[i] 
=  Int32.Parse(numStr.Substring(numPosition,  1 ));
             }
             
// 生成验证码
              for  ( int  i  =   0 ; i  <  length; i ++ )
             {
                 validateNumberStr 
+=  validateNums[i].ToString();
             }
             
return  validateNumberStr;
         }

         
///   <summary>
         
///  生成验证码字节数组(汉字)
         
///   </summary>
         
///   <param name="length"> 指定验证码的长度 </param>
         
///   <returns> object[]  </returns>
          private   object [] CreateValidateCode( int  length)
         {
             
// 定义一个字符串数组储存汉字编码的组成元素 
              string [] rBase  =   new  String[ 16 ] {  " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " a " " b " " c " " d " " e " " f "  };

             Random rnd 
=   new  Random();

             
// 定义一个object数组用来 
              object [] bytes  =   new   object [length];

             
/**/
             
/**/
             
/**/
             
/* 每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 
          每个汉字有四个区位码组成 
          区位码第1位和区位码第2位作为字节数组第一个元素 
          区位码第3位和区位码第4位作为字节数组第二个元素 
         
*/
             
for  ( int  i  =   0 ; i  <  length; i ++ )
             {
                 
// 区位码第1位 
                  int  r1  =  rnd.Next( 11 14 );
                 
string  str_r1  =  rBase[r1].Trim();

                 
// 区位码第2位 
                 rnd  =   new  Random(r1  *   unchecked (( int )DateTime.Now.Ticks)  +  i); // 更换随机数发生器的种子避免产生重复值 
                  int  r2;
                 
if  (r1  ==   13 )
                 {
                     r2 
=  rnd.Next( 0 7 );
                 }
                 
else
                 {
                     r2 
=  rnd.Next( 0 16 );
                 }
                 
string  str_r2  =  rBase[r2].Trim();

                 
// 区位码第3位 
                 rnd  =   new  Random(r2  *   unchecked (( int )DateTime.Now.Ticks)  +  i);
                 
int  r3  =  rnd.Next( 10 16 );
                 
string  str_r3  =  rBase[r3].Trim();

                 
// 区位码第4位 
                 rnd  =   new  Random(r3  *   unchecked (( int )DateTime.Now.Ticks)  +  i);
                 
int  r4;
                 
if  (r3  ==   10 )
                 {
                     r4 
=  rnd.Next( 1 16 );
                 }
                 
else   if  (r3  ==   15 )
                 {
                     r4 
=  rnd.Next( 0 15 );
                 }
                 
else
                 {
                     r4 
=  rnd.Next( 0 16 );
                 }
                 
string  str_r4  =  rBase[r4].Trim();

                 
// 定义两个字节变量存储产生的随机汉字区位码 
                  byte  byte1  =  Convert.ToByte(str_r1  +  str_r2,  16 );
                 
byte  byte2  =  Convert.ToByte(str_r3  +  str_r4,  16 );
                 
// 将两个字节变量存储在字节数组中 
                  byte [] str_r  =   new   byte [] { byte1, byte2 };

                 
// 将产生的一个汉字的字节数组放入object数组中 
                 bytes.SetValue(str_r, i);

             }


             
return  bytes;

         }

         
///   <summary>
         
///  生成验证码(汉字)
         
///   </summary>
         
///   <param name="length"> 长度 </param>
         
///   <returns> string </returns>
          public   string  CreateValidateNumberAndCC( int  length)
         {
             Encoding gb 
=  Encoding.GetEncoding( " gb2312 " );

             
// 调用函数产生length个随机中文汉字编码 
              object [] bytes  =  CreateValidateCode(length);

             
string  str  =   "" ;
             
for  ( int  i  =   0 ; i  <  length; i ++ )
             {
                 str 
+=  gb.GetString(( byte [])Convert.ChangeType(bytes[i],  typeof ( byte [])));
             }

             
return  str;
         }


         
///   <summary>
         
///  生成验证码(数字,字母)
         
///   </summary>
         
///   <param name="length"> 长度 </param>
         
///   <returns> string </returns>
          public   string  CreateValidateNumberAndLetter( int  length)
         {
             
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,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 " ;
             
string [] VcArray  =  Vchar.Split( ' , ' );
             
string  VNum  =   "" ;
             Random random 
=   new  Random();
             
for  ( int  i  =   1 ; i  <=  length; i ++ )
             {
                 
int  iNum  =   0 ;
                 
while  ((iNum  =  Convert.ToInt32(VcArray.Length  *  random.NextDouble()))  ==  VcArray.Length)
                 {
                     iNum 
=  Convert.ToInt32(VcArray.Length  *  random.NextDouble());
                 }
                 VNum 
+=  VcArray[iNum];
                 
//  VNum += VcArray[Convert.ToInt32(VcArray.Length*random.NextDouble())];
             }
             
return  VNum;
         } 


         
///   <summary>
         
///  创建验证码的图片
         
///   </summary>
         
///   <param name="containsPage"> 要输出到的page对象 </param>
         
///   <param name="validateNum"> 验证码 </param>
          public   void  CreateValidateGraphic(Page containsPage,  string  validateNum)
         {

             Bitmap image 
=   new  Bitmap(( int )Math.Ceiling(validateNum.Length  *   21.5 ),  22 );
             Graphics g 
=  Graphics.FromImage(image);
             
try
             {
                 
// 生成随机生成器
                 Random random  =   new  Random();
                 
// 清空图片背景色
                 g.Clear(Color.White);
                 
// 画图片的干扰线
                  for  ( int  i  =   0 ; i  <   25 ; i ++ )
                 {
                     
int  x1  =  random.Next(image.Width);
                     
int  x2  =  random.Next(image.Width);
                     
int  y1  =  random.Next(image.Height);
                     
int  y2  =  random.Next(image.Height);
                     g.DrawLine(
new  Pen(Color.GreenYellow), x1, y1, x2, y2);
                 }
                 Font font 
=   new  Font( " Arial " 12 , (FontStyle.Bold  |  FontStyle.Italic));
                 LinearGradientBrush brush 
=   new  LinearGradientBrush( new  Rectangle( 0 0 , image.Width, image.Height),
                  Color.Blue, Color.Green, 
1.2f true );
                 g.DrawString(validateNum, font, brush, 
3 2 );
                 
// 画图片的前景干扰点
                  for  ( int  i  =   0 ; i  <   100 ; i ++ )
                 {
                     
int  x  =  random.Next(image.Width);
                     
int  y  =  random.Next(image.Height);
                     image.SetPixel(x, y, Color.FromArgb(random.Next()));
                 }
                 
// 画图片的边框线
                 g.DrawRectangle( new  Pen(Color.LightSeaGreen),  0 0 , image.Width  -   1 , image.Height  -   1 );
                 
// 保存图片数据
                 MemoryStream stream  =   new  MemoryStream();
                 image.Save(stream, ImageFormat.Jpeg);
                 
// 输出图片
                 containsPage.Response.Clear();
                 containsPage.Response.ContentType 
=   " image/jpeg " ;
                 containsPage.Response.BinaryWrite(stream.ToArray());
             }
             
finally
             {
                 g.Dispose();
                 image.Dispose();
             }
         }


         
///   <summary>
         
///  得到验证码图片的长度
         
///   </summary>
         
///   <param name="validateNumLength"> 验证码的长度 </param>
         
///   <returns></returns>
          public   static   int  GetImageWidth( int  validateNumLength)
         {
             
return  ( int )(validateNumLength  *   12.5 );
         }
         
///   <summary>
         
///  得到验证码的高度
         
///   </summary>
         
///   <returns></returns>
          public   static   double  GetImageHeight()
         {
             
return   22.5 ;
         }
     }
}

 以上代碼,其中生成圖片的函數只是針對Web編程,如果要在winForm中也使用,則需要做一定修改,主要修改輸出部分,代碼如下:

          ///   <summary>
        
///  创建验证码的图片
        
///   </summary>
        
///   <param name="pb"> 要输出到的PictureBox对象 </param>
        
///   <param name="validateNum"> 验证码 </param>         
         public   void  CreateValidateGraphic(PictureBox pb, string  validateNum)
        {
            Bitmap image 
=   new  Bitmap(( int )Math.Ceiling(validateNum.Length  *   21.5 ),  22 );
            Graphics g 
=  Graphics.FromImage(image);
            
try
            {
                
// 生成随机生成器
                Random random  =   new  Random();
                
// 清空图片背景色
                g.Clear(Color.White);
                
// 画图片的干扰线
                 for  ( int  i  =   0 ; i  <   25 ; i ++ )
                {
                    
int  x1  =  random.Next(image.Width);
                    
int  x2  =  random.Next(image.Width);
                    
int  y1  =  random.Next(image.Height);
                    
int  y2  =  random.Next(image.Height);
                    g.DrawLine(
new  Pen(Color.GreenYellow), x1, y1, x2, y2);
                }
                Font font 
=   new  Font( " Arial " 12 , (FontStyle.Bold  |  FontStyle.Italic));
                LinearGradientBrush brush 
=   new  LinearGradientBrush( new  Rectangle( 0 0 , image.Width, image.Height),
                 Color.Blue, Color.Green, 
1.2f true );
                g.DrawString(validateNum, font, brush, 
3 2 );
                
// 画图片的前景干扰点
                 for  ( int  i  =   0 ; i  <   100 ; i ++ )
                {
                    
int  x  =  random.Next(image.Width);
                    
int  y  =  random.Next(image.Height);
                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }
                
// 画图片的边框线
                g.DrawRectangle( new  Pen(Color.LightSeaGreen),  0 0 , image.Width  -   1 , image.Height  -   1 );
                
// 保存图片数据
                MemoryStream stream  =   new  MemoryStream();
                image.Save(stream, ImageFormat.Jpeg);
                
// 输出图片
                pb.Image  =  image;
            }
            
finally
            {
                g.Dispose();
            }
        }

 

本文轉自: http://hi.baidu.com/rocy520/blog/item/eb4edded6c15724e79f0554c.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值