ValidateCode.cs 5.3 KB

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