mvc实现图片验证码功能

 更新时间:2021年9月22日 10:01  点击:1903

mvc中实现图片验证码很简单,只需要创建一个 FileContentResult的方法,返回file就行

/// <summary>
    /// 创建一个文件方法
    /// </summary>
    /// <returns></returns>
    public FileContentResult GetCode() {
      //参数一:产生几个字符的验证码图片 参数二:验证码的形式(数字、字母、数字字母混合都有)
      ValidateCode validCode = new ValidateCode(5, ValidateCode.CodeType.Alphas);
        //将图片转换为二进制
      MemoryStream ms =validCode.CreateCheckCodeImage() as MemoryStream;
        dateCode = validCode.CheckCode; //通过 CheckCode获取当前的验证码
      byte[] buffurPic = ms.ToArray(); 
      return File(buffurPic, "image/jpeg"); 
  
    }

以下是生成验证码代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
 
namespace Helper
{
  public class ValidateCode
  {
 
 
   #region Private Fields 
   private const double PI = 3.1415926535897932384626433832795; 
   private const double PI2 = 6.283185307179586476925286766559; 
   //private readonly int _wordsLen = 4; 
   private int _len;
   private CodeType _codetype;
   private readonly Single _jianju = (float)18.0; 
   private readonly Single _height = (float)24.0; 
   private string _checkCode; 
   #endregion 
   #region Public Property 
   public string CheckCode
   {
 
     get
     {
 
       return _checkCode;
 
     }
 
   }
 
   #endregion
 
   #region Constructors 
   ///  
   /// public constructors 
   /// 
   /// 验证码长度  
   /// 验证码类型:字母、数字、字母+ 数字 
 
   public ValidateCode(int len, CodeType ctype)
   { 
     this._len = len; 
     this._codetype = ctype;
 
   }
 
   #endregion 
   #region Public Field 
   public enum CodeType { Words, Numbers, Characters, Alphas } 
   #endregion 
   #region Private Methods
 
   public string GenerateNumbers()
   {
 
     string strOut = ""; 
     System.Random random = new Random();
     for (int i = 0; i < _len; i++)
     {
       string num = Convert.ToString(random.Next(10000) % 10); 
       strOut += num;
 
     }
 
     return strOut.Trim();
 
   }
 
 
 
   public string GenerateCharacters()
   {
 
     string strOut = ""; 
     System.Random random = new Random(); 
     for (int i = 0; i < _len; i++)
     {
       string num = Convert.ToString((char)(65 + random.Next(10000) % 26)); 
       strOut += num;
 
     }
 
     return strOut.Trim(); 
   }
 
   // 
 
   public string GenerateAlphas()
   {
     string strOut = ""; 
     string num = ""; 
     System.Random random = new Random();
     for (int i = 0; i < _len; i++)
     {
 
       if (random.Next(500) % 2 == 0)
       {
          num = Convert.ToString(random.Next(10000) % 10);
 
       }
 
       else
       { 
         num = Convert.ToString((char)(65 + random.Next(10000) % 26));
 
       }
 
       strOut += num;
 
     }
      return strOut.Trim();
 
   }
 
 
 
   private System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
   {
      System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
 
     // 将位图背景填充为白色 
     System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp); 
     graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height); 
     graph.Dispose(); 
 
     double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;
 
     for (int i = 0; i < destBmp.Width; i++)
     { 
       for (int j = 0; j < destBmp.Height; j++)
       { 
         double dx = 0;
         dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
         dx += dPhase; 
         double dy = Math.Sin(dx);
 

         // 取得当前点的颜色 
         int nOldX = 0, nOldY = 0;
         nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
         nOldY = bXDir ? j : j + (int)(dy * dMultValue);
 
         System.Drawing.Color color = srcBmp.GetPixel(i, j);
         if (nOldX >= 0 && nOldX < destBmp.Width 
          && nOldY >= 0 && nOldY < destBmp.Height)
         {
 
           destBmp.SetPixel(nOldX, nOldY, color);
 
         }
 
       }
 
     }
 
 
 
     return destBmp;
 
   }
 
   #endregion 
   #region Public Methods
 
   public Stream CreateCheckCodeImage()
   {
 
     string checkCode; 
     switch (_codetype)
     {
 
       case CodeType.Alphas:
          checkCode = GenerateAlphas();
         break;
 
       case CodeType.Numbers:
         checkCode = GenerateNumbers();
         break;
 
       case CodeType.Characters: 
         checkCode = GenerateCharacters(); 
         break; 
       default:
 
         checkCode = GenerateAlphas();
 
         break;
 
     }
 
     this._checkCode = checkCode; 
     MemoryStream ms = null;
 
     // 
 
     if (checkCode == null || checkCode.Trim() == String.Empty)
 
       return null;
 
     Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * _jianju)), (int)_height);
     Graphics g = Graphics.FromImage(image);
 
     try
     {
 
       Random random = new Random(); 
       g.Clear(Color.White); 
       // 画图片的背景噪音线 
       for (int i = 0; i < 18; i++)
       {
         int x1 = random.Next(image.Width); 
         int x2 = random.Next(image.Width);
         int y1 = random.Next(image.Height);
         int y2 = random.Next(image.Height);
 
         g.DrawLine(new Pen(Color.FromArgb(random.Next()), 1), x1, y1, x2, y2);
 
       }
 
       Font font = new System.Drawing.Font("Times New Roman", 14, System.Drawing.FontStyle.Bold); 
       LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
 
       if (_codetype != CodeType.Words)
       {
 
         for (int i = 0; i < checkCode.Length; i++)
         {
 
           g.DrawString(checkCode.Substring(i, 1), font, brush, 2 + i * _jianju, 1);
 
         }
 
       }
       else
       {
 
         g.DrawString(checkCode, font, brush, 2, 2);
 
       }
 
       // 画图片的前景噪音点 
 
       for (int i = 0; i < 150; i++)
       {
 
         int x = random.Next(image.Width); 
         int y = random.Next(image.Height); 
         image.SetPixel(x, y, Color.FromArgb(random.Next()));
 
       }
 
       // 画图片的波形滤镜效果 
 
       if (_codetype != CodeType.Words)
       {
 
         image = TwistImage(image, true, 3, 1);
 
       }
 
       // 画图片的边框线 
 
       g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); 
       ms = new System.IO.MemoryStream(); 
       image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
 
     }
 
     finally
     {
 
       g.Dispose(); 
       image.Dispose();
 
     }
 
     return ms;
 
   }
 
   #endregion
   
 
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • JS实现随机生成验证码

    这篇文章主要为大家详细介绍了JS实现随机生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-06
  • jQuery Real Person验证码插件防止表单自动提交

    本文介绍的jQuery插件有点特殊,防自动提交表单的验证工具,就是我们经常用到的验证码工具,先给大家看看效果。效果图如下: 使用说明 需要使用jQuery库文件和Real Person库文件 同时需要自定义验证码显示的CSS样式 使用实例...2015-11-08
  • Jquery插件实现点击获取验证码后60秒内禁止重新获取

    通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能效果图:先到官网(http://plugins.jquery.com/cookie/)下载cookie插件,放到相应文件夹,代码如下:复制代码 代码如下: <!DOCTYPE ht...2015-03-15
  • php实现点击可刷新验证码

    验证码类文件 CreateImg.class.php <&#63;php class ValidationCode { private $width,$height,$codenum; public $checkcode; //产生的验证码 private $checkimage; //验证码图片 private $disturbColor = ''; /...2015-11-08
  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • 基于JavaScript实现验证码功能

    这篇文章主要介绍了基于JavaScript实现验证码功能的相关资料...2017-04-03
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • 单击按钮发送验证码,出现倒计时的简单实例

    下面小编就为大家带来一篇单击按钮发送验证码,出现倒计时的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 代码...2017-07-06
  • PHP验证码生成与验证例子

    验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • 基于Pytorch版yolov5的滑块验证码破解思路详解

    这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
  • Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法

    这篇文章主要介绍了Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-06-24
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • 工信部的ICP备案网站登录时验证码一直输入不正确怎么回事

    工信部的ICP备案网站登录时验证码一直输入不正确怎么回事,为了防止一些机器采集人工信部对于查询验证做得识别度极低,所以许多的朋友都会发现输入验证码一直有问题了,那...2016-10-10
  • jQuery实现发送验证码控制按钮禁用功能

    最近接到新需求,需要实现一个点击发送验证码之后,按钮禁用,在5秒之后取消禁用,看似需求很简单,实现起来还真的好好动动脑筋,下面小编把jquery控制按钮禁用核心代码分享给大家,需要的朋友参考下吧...2021-07-24
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • Web制作验证码功能实例代码

    web开发中,经常会使用验证码功能,例如登录、注册,或其他关键功能之前经常会使用。下面通过实例代码给大家介绍Web制作验证码功能实例代码,感兴趣的朋友一起看看吧...2017-06-24