使用mvc怎么实现一个图片验证码功能
创始人
2024-11-27 16:23:16
0次

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

/// 
    /// 创建一个文件方法
    /// 
    /// 
    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
   
 
  }
}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...