视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mvc实现图片验证码功能
2020-11-27 22:34:41 责编:小采
文档


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.141592653579323846233832795; 
 private const double PI2 = 6.2831853071795876925286766559; 
 //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
 
 
 }
}

下载本文
显示全文
专题