CaptchHelper.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Imaging;
  4. using System.IO;
  5. namespace GxPress.Common.Tools
  6. {
  7. /// <summary>
  8. /// 验证码
  9. /// </summary>
  10. public static class CaptchaHelper
  11. {
  12. /// <summary>
  13. /// 该方法是将生成的随机数写入图像文件
  14. /// </summary>
  15. /// <param name="code">code是一个随机数</param>
  16. /// <param name="numbers">生成位数(默认4位)</param>
  17. public static MemoryStream Create(out string code, int numbers = 4)
  18. {
  19. code = RandomGenerator.GetString(numbers);
  20. //生成验证码图片
  21. var random = new Random();
  22. //验证码颜色集合
  23. Color[] c =
  24. {
  25. Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan,
  26. Color.Purple
  27. };
  28. //验证码字体集合
  29. string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
  30. //定义图像的大小,生成图像的实例
  31. var img = new Bitmap(code.Length * 18, 32);
  32. var g = Graphics.FromImage(img);
  33. g.Clear(Color.White); //背景设为白色
  34. //在随机位置画背景点
  35. for (var i = 0; i < 100; i++)
  36. {
  37. var x = random.Next(img.Width);
  38. var y = random.Next(img.Height);
  39. g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
  40. }
  41. //验证码绘制在g中
  42. for (var i = 0; i < code.Length; i++)
  43. {
  44. var cIndex = random.Next(7); //随机颜色索引值
  45. var fIndex = random.Next(5); //随机字体索引值
  46. var f = new Font(fonts[fIndex], 15, FontStyle.Bold); //字体
  47. Brush b = new SolidBrush(c[cIndex]); //颜色
  48. var ii = 4;
  49. if ((i + 1) % 2 == 0) //控制验证码不在同一高度
  50. ii = 2;
  51. g.DrawString(code.Substring(i, 1), f, b, 3 + i * 12, ii); //绘制一个验证字符
  52. }
  53. var ms = new MemoryStream();
  54. img.Save(ms, ImageFormat.Jpeg); //将此图像以Png图像文件的格式保存到流中
  55. //回收资源
  56. g.Dispose();
  57. img.Dispose();
  58. return ms;
  59. }
  60. }
  61. }