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