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

来源:互联网 发布:时时彩 彩票软件 源码 编辑:程序博客网 时间:2024/06/05 19:48

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

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(1114);
                 
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(07);
                 }
                 
else
                 {
                     r2 
= rnd.Next(016);
                 }
                 
string str_r2 = rBase[r2].Trim();

                 
//区位码第3位 
                 rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
                 
int r3 = rnd.Next(1016);
                 
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(116);
                 }
                 
else if (r3 == 15)
                 {
                     r4 
= rnd.Next(015);
                 }
                 
else
                 {
                     r4 
= rnd.Next(016);
                 }
                 
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(00, image.Width, image.Height),
                  Color.Blue, Color.Green, 
1.2ftrue);
                 g.DrawString(validateNum, font, brush, 
32);
                 
//画图片的前景干扰点
                 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), 00, 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(00, image.Width, image.Height),
                 Color.Blue, Color.Green, 
1.2ftrue);
                g.DrawString(validateNum, font, brush, 
32);
                
//画图片的前景干扰点
                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), 00, 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