生成图片验证码

谁践踏了优雅 2022-08-18 15:27 319阅读 0赞

原地址:http://www.cnblogs.com/luminji/p/4794453.html

控制器部分:

///


/// 验证码
///

///
public ActionResult CheckCode()
{
//首先实例化验证码的类
ValidateCode validateCode = new ValidateCode();
//生成验证码指定的长度
string code = validateCode.CreateValidateCode(4);
//创建验证码的图片
byte[] bytes = validateCode.CreateValidateGraphic(code);
//最后将验证码返回
return File(bytes, @”image/jpeg”);
}

工具类:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TMinjiP2P.Utility.Web
{
public class ValidateCode
{
///


/// 验证码的最大长度
///

public int MaxLength
{
get { return 10; }
}

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

}

前台:

发表评论

表情:
评论列表 (有 0 条评论,319人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Kaptcha生成图片验证

    Kaptcha简介 kaptcha 是一个很有用的验证码生成工具。由于它是可配置的,有了它,你能够生成各种样式的验证码。 Kaptcha 是一个可高度配置的实用验证码

    相关 Java生成图片验证

    功能介绍:自定义图片尺寸和字符长度,随机背景颜色和字符颜色,随机字符偏移角度,字符平滑边缘,干扰线,噪点,背景扭曲。 VerifyCodeUtils类,生成图片流,然后不同框

    相关 生成图片验证

    问题描述 在项目中遇到有人恶意拉取图片资源,无限刷资源,导致阿里图片服务器流量暴涨(钱遭不住),使得带宽一直处于上限,正常用户不能好的访问。 解决办法 这个功能设