视频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
.NET Core 2.0如何生成图片验证码完整实例
2020-11-27 22:35:03 责编:小采
文档


前言

图片验证码在我们日常开发中是必不可少会遇见的一个功能,最近工作中就遇到了这个需求,所以下面将实现的方法分享给大家,话不多说了,来一起看看详细的介绍吧。

.NET Core 2.0生成图片验证码

NuGet包引入:ZKWeb.System.Drawing,如下所示:

代码实例如下:VerifyCodeHelper

using System;
using System.DrawingCore;
using System.DrawingCore.Drawing2D;
using System.DrawingCore.Imaging;
using System.IO;
 
namespace Common.Helper
{
 public sealed class VerifyCodeHelper
 {
 #region 单例模式
 //创建私有化静态obj锁 
 private static readonly object _ObjLock = new object();
 //创建私有静态字段,接收类的实例化对象 
 private static VerifyCodeHelper _VerifyCodeHelper = null;
 //构造函数私有化 
 private VerifyCodeHelper() { }
 //创建单利对象资源并返回 
 public static VerifyCodeHelper GetSingleObj()
 {
 if (_VerifyCodeHelper == null)
 {
 lock (_ObjLock)
 {
 if (_VerifyCodeHelper == null)
 _VerifyCodeHelper = new VerifyCodeHelper();
 }
 }
 return _VerifyCodeHelper;
 }
 #endregion
 
 #region 生产验证码
 public enum VerifyCodeType { NumberVerifyCode, AbcVerifyCode, MixVerifyCode };
 
 /// <summary>
 /// 1.数字验证码
 /// </summary>
 /// <param name="length"></param>
 /// <returns></returns>
 private string CreateNumberVerifyCode(int length)
 {
 int[] randMembers = new int[length];
 int[] validateNums = new int[length];
 string validateNumberStr = "";
 //生成起始序列值 
 int seekSeek = unchecked((int)DateTime.Now.Ticks);
 Random seekRand = new Random(seekSeek);
 int beginSeek = seekRand.Next(0, Int32.MaxValue - length * 10000);
 int[] seeks = new int[length];
 for (int i = 0; i < length; i++)
 {
 beginSeek += 10000;
 seeks[i] = beginSeek;
 }
 //生成随机数字 
 for (int i = 0; i < length; i++)
 {
 Random rand = new Random(seeks[i]);
 int pownum = 1 * (int)Math.Pow(10, length);
 randMembers[i] = rand.Next(pownum, Int32.MaxValue);
 }
 //抽取随机数字 
 for (int i = 0; i < length; i++)
 {
 string numStr = randMembers[i].ToString();
 int numLength = numStr.Length;
 Random rand = new Random();
 int numPosition = rand.Next(0, numLength - 1);
 validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
 }
 //生成验证码 
 for (int i = 0; i < length; i++)
 {
 validateNumberStr += validateNums[i].ToString();
 }
 return validateNumberStr;
 }
 
 /// <summary>
 /// 2.字母验证码
 /// </summary>
 /// <param name="length">字符长度</param>
 /// <returns>验证码字符</returns>
 private string CreateAbcVerifyCode(int length)
 {
 char[] verification = new char[length];
 char[] dictionary = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
 };
 Random random = new Random();
 for (int i = 0; i < length; i++)
 {
 verification[i] = dictionary[random.Next(dictionary.Length - 1)];
 }
 return new string(verification);
 }
 
 /// <summary>
 /// 3.混合验证码
 /// </summary>
 /// <param name="length">字符长度</param>
 /// <returns>验证码字符</returns>
 private string CreateMixVerifyCode(int length)
 {
 char[] verification = new char[length];
 char[] dictionary = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
 };
 Random random = new Random();
 for (int i = 0; i < length; i++)
 {
 verification[i] = dictionary[random.Next(dictionary.Length - 1)];
 }
 return new string(verification);
 }
 
 /// <summary>
 /// 产生验证码(随机产生4-6位)
 /// </summary>
 /// <param name="type">验证码类型:数字,字符,符合</param>
 /// <returns></returns>
 public string CreateVerifyCode(VerifyCodeType type)
 {
 string verifyCode = string.Empty;
 Random random = new Random();
 int length = random.Next(4, 6);
 switch (type)
 {
 case VerifyCodeType.NumberVerifyCode:
 verifyCode = GetSingleObj().CreateNumberVerifyCode(length);
 break;
 case VerifyCodeType.AbcVerifyCode:
 verifyCode = GetSingleObj().CreateAbcVerifyCode(length);
 break;
 case VerifyCodeType.MixVerifyCode:
 verifyCode = GetSingleObj().CreateMixVerifyCode(length);
 break;
 }
 return verifyCode;
 }
 #endregion
 
 #region 验证码图片
 /// <summary>
 /// 验证码图片 => Bitmap
 /// </summary>
 /// <param name="verifyCode">验证码</param>
 /// <param name="width">宽</param>
 /// <param name="height">高</param>
 /// <returns>Bitmap</returns>
 public Bitmap CreateBitmapByImgVerifyCode(string verifyCode, int width, int height)
 {
 Font font = new Font("Arial", 14, (FontStyle.Bold | FontStyle.Italic));
 Brush brush;
 Bitmap bitmap = new Bitmap(width, height);
 Graphics g = Graphics.FromImage(bitmap);
 SizeF totalSizeF = g.MeasureString(verifyCode, font);
 SizeF curCharSizeF;
 PointF startPointF = new PointF(0, (height - totalSizeF.Height) / 2);
 Random random = new Random(); //随机数产生器
 g.Clear(Color.White); //清空图片背景色 
 for (int i = 0; i < verifyCode.Length; i++)
 {
 brush = new LinearGradientBrush(new Point(0, 0), new Point(1, 1), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)));
 g.DrawString(verifyCode[i].ToString(), font, brush, startPointF);
 curCharSizeF = g.MeasureString(verifyCode[i].ToString(), font);
 startPointF.X += curCharSizeF.Width;
 }
 
 //画图片的干扰线 
 for (int i = 0; i < 10; i++)
 {
 int x1 = random.Next(bitmap.Width);
 int x2 = random.Next(bitmap.Width);
 int y1 = random.Next(bitmap.Height);
 int y2 = random.Next(bitmap.Height);
 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
 }
 
 //画图片的前景干扰点 
 for (int i = 0; i < 100; i++)
 {
 int x = random.Next(bitmap.Width);
 int y = random.Next(bitmap.Height);
 bitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
 }
 
 g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1); //画图片的边框线 
 g.Dispose();
 return bitmap;
 }
 
 /// <summary>
 /// 验证码图片 => byte[]
 /// </summary>
 /// <param name="verifyCode">验证码</param>
 /// <param name="width">宽</param>
 /// <param name="height">高</param>
 /// <returns>byte[]</returns>
 public byte[] CreateByteByImgVerifyCode(string verifyCode, int width, int height)
 {
 Font font = new Font("Arial", 14, (FontStyle.Bold | FontStyle.Italic));
 Brush brush;
 Bitmap bitmap = new Bitmap(width, height);
 Graphics g = Graphics.FromImage(bitmap);
 SizeF totalSizeF = g.MeasureString(verifyCode, font);
 SizeF curCharSizeF;
 PointF startPointF = new PointF(0, (height - totalSizeF.Height) / 2);
 Random random = new Random(); //随机数产生器
 g.Clear(Color.White); //清空图片背景色 
 for (int i = 0; i < verifyCode.Length; i++)
 {
 brush = new LinearGradientBrush(new Point(0, 0), new Point(1, 1), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)));
 g.DrawString(verifyCode[i].ToString(), font, brush, startPointF);
 curCharSizeF = g.MeasureString(verifyCode[i].ToString(), font);
 startPointF.X += curCharSizeF.Width;
 }
 
 //画图片的干扰线 
 for (int i = 0; i < 10; i++)
 {
 int x1 = random.Next(bitmap.Width);
 int x2 = random.Next(bitmap.Width);
 int y1 = random.Next(bitmap.Height);
 int y2 = random.Next(bitmap.Height);
 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
 }
 
 //画图片的前景干扰点 
 for (int i = 0; i < 100; i++)
 {
 int x = random.Next(bitmap.Width);
 int y = random.Next(bitmap.Height);
 bitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
 }
 
 g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1); //画图片的边框线 
 g.Dispose();
 
 //保存图片数据 
 MemoryStream stream = new MemoryStream();
 bitmap.Save(stream, ImageFormat.Jpeg);
 //
输出图片流 return stream.ToArray(); } #endregion } }

新建控制器:VerifyCodeController,

using System.DrawingCore.Imaging;
using System.IO;
using Common.Helper;
using Microsoft.AspNetCore.Mvc;
 
namespace WebApplicationApi.Controllers
{
 public class VerifyCodeController : Controller
 {
 public IActionResult Index()
 {
 return View();
 }
 
 /// <summary>
 /// 数字验证码
 /// </summary>
 /// <returns></returns>
 public FileContentResult NumberVerifyCode()
 {
 string code = VerifyCodeHelper.GetSingleObj().CreateVerifyCode(VerifyCodeHelper.VerifyCodeType.NumberVerifyCode);
 byte[] codeImage = VerifyCodeHelper.GetSingleObj().CreateByteByImgVerifyCode(code, 100, 40);
 return File(codeImage, @"image/jpeg");
 }
 
 /// <summary>
 /// 字母验证码
 /// </summary>
 /// <returns></returns>
 public FileContentResult AbcVerifyCode()
 {
 string code = VerifyCodeHelper.GetSingleObj().CreateVerifyCode(VerifyCodeHelper.VerifyCodeType.AbcVerifyCode);
 var bitmap = VerifyCodeHelper.GetSingleObj().CreateBitmapByImgVerifyCode(code, 100, 40);
 MemoryStream stream = new MemoryStream();
 bitmap.Save(stream, ImageFormat.Png);
 return File(stream.ToArray(), "image/png");
 }
 
 /// <summary>
 /// 混合验证码
 /// </summary>
 /// <returns></returns>
 public FileContentResult MixVerifyCode()
 {
 string code = VerifyCodeHelper.GetSingleObj().CreateVerifyCode(VerifyCodeHelper.VerifyCodeType.MixVerifyCode);
 var bitmap = VerifyCodeHelper.GetSingleObj().CreateBitmapByImgVerifyCode(code, 100, 40);
 MemoryStream stream = new MemoryStream();
 bitmap.Save(stream, ImageFormat.Gif);
 return File(stream.ToArray(), "image/gif");
 }
 
 }
}

添加页面index.cshtml,如下代码:

@{
 Layout = null;
}
<!DOCTYPE html>
<html>
<head>
 <meta name="viewport" content="width=device-width" />
 <title>Index</title>
</head>
<body>
 <figure>
 <h3>图片验证码</h3>
 <fieldset>
 <legend>数字验证码</legend>
 <img id="nubImg" title="数字验证码" src="https://www.gxlcms.com/VerifyCode/NumberVerifyCode?random=" vcode" onclick="refresh()" style="cursor:pointer;" />
 </fieldset>
 <fieldset>
 <legend>数字验证码</legend>
 <img id="abcImg" title="字母验证码" src="https://www.gxlcms.com/VerifyCode/AbcVerifyCode" vcode" onclick="this.src=this.src+'?'" style="cursor:pointer;" />
 </fieldset>
 <fieldset>
 <legend>混合验证码</legend>
 <img id="mixImg" title="数字字母混合验证码" src="https://www.gxlcms.com/VerifyCode/MixVerifyCode" vcode" onclick="this.src=this.src+'?'" style="cursor:pointer;" />
 </fieldset>
 </figure>
 
 <script type="text/javascript">
 function refresh() {
 var id = document.getElementById("nubImg");
 var str = "/VerifyCode/NumberVerifyCode?random=" + Math.random();
 id.setAttribute("src", str);
 }
 </script>
 
</body>
</html>

生成验证码如下所示:

总结

下载本文
显示全文
专题