生成验证码
验证码生成步骤:
1、根据制定的验证码长度,随机生成验证码字符串。(此处需要注意“随机“的定义)
2、根据生成的验证码字符串绘制对应的验证码图形
具体代码如下:
1 /// <summary> 2 /// Validate code manager 3 /// </summary> 4 public class ValidateCodeManager 5 { 6 /// <summary> 7 /// 生成验证码图片 8 /// </summary> 9 /// <param name="length"></param> 10 /// <returns></returns> 11 public byte[] GenerateValidateCodeImg(int length) 12 { 13 string validateCode = GenerateString(length); 14 byte[] data = GenerateValidateGraphic(validateCode); 15 return data; 16 } 17 18 /// <summary> 19 /// 生成随机的字符串 20 /// </summary> 21 /// <param name="length"></param> 22 /// <returns></returns> 23 private string GenerateString(int length) 24 { 25 char[] chars = new char[] { '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', 'V', 'W', 'X', 'Y', 'Z' }; 26 string validateCode = ""; 27 int temp = 1; 28 Random rand = new Random(); 29 for (int i = 0; i < length; i++) 30 { 31 if (i > 0) 32 { 33 rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); 34 } 35 int t = rand.Next(36); 36 validateCode += chars[t]; 37 if (temp == t) 38 { 39 temp += 10; 40 } 41 else 42 { 43 temp = t; 44 } 45 46 } 47 return validateCode; 48 } 49 50 /// <summary> 51 /// 创建验证码图片 52 /// </summary> 53 /// <param name="validateCode"></param> 54 /// <returns></returns> 55 private byte[] GenerateValidateGraphic(string validateCode) 56 { 57 Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 16.0), 28); 58 Graphics g = Graphics.FromImage(image); 59 try 60 { 61 //生成随机生成器 62 Random random = new Random(); 63 //清空图片背景色 64 g.Clear(Color.White); 65 //画图片的干扰线 66 for (int i = 0; i < 30; i++) 67 { 68 int x1 = random.Next(image.Width); 69 int x2 = random.Next(image.Width); 70 int y1 = random.Next(image.Height); 71 int y2 = random.Next(image.Height); 72 g.DrawLine(new Pen(Color.Silver), x1, x2, y1, y2); 73 } 74 Font font = new Font("Arial", 13, (FontStyle.Bold | FontStyle.Italic)); 75 LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); 76 g.DrawString(validateCode, font, brush, 3, 2); 77 78 //画图片的前景干扰线 79 for (int i = 0; i < 100; i++) 80 { 81 int x = random.Next(image.Width); 82 int y = random.Next(image.Height); 83 image.SetPixel(x, y, Color.FromArgb(random.Next())); 84 } 85 //画图片的边框线 86 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); 87 88 //图片数据 89 MemoryStream stream = new MemoryStream(); 90 image.Save(stream, ImageFormat.Jpeg); 91 return stream.ToArray(); 92 } 93 finally 94 { 95 g.Dispose(); 96 image.Dispose(); 97 } 98 } 99 }
调用:
1 private void btnValidateCode_Click(object sender, EventArgs e) 2 { 3 ValidateCodeManager validateCodeManager = new ValidateCodeManager(); 4 byte[] datas = validateCodeManager.GenerateValidateCodeImg(5); 5 MemoryStream ms = new MemoryStream(datas); 6 this.pbValidateCode.Image = Image.FromStream(ms); 7 }