C#生成数字验证码

  

 1      context.Response.ContentType = "text/plain"; 
 2 
 3             //创建一个 位图:确定高度宽度
 4             //位图上创建画布
 5             //画布上画一个字符串
 6 
 7             ValidateImagCode validateImgCode = new ValidateImagCode();
 8 
 9             //生成验证码数字 
10             string strCode = validateImgCode.CreateValidateCode(4);
11 
12             //创建画布写入验证码
13             validateImgCode.CreateValidateGraphic(strCode, context);    


1

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

 

posted @ 2017-04-19 16:41  王小二不在家  阅读(313)  评论(0编辑  收藏  举报