mvc实现图片验证码功能

来源:互联网 发布:经纬度转换成坐标软件 编辑:程序博客网 时间:2024/06/06 18:48


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          }}

0 0
原创粉丝点击