参考这篇文章: http://www.cnblogs.com/yuangang/p/6000460.html
using System;using System.IO;using System.DrawingCore;using System.DrawingCore.Imaging;namespace MobileWeb.Utility{ ???public class Captcha ???{ ???????public string CreateValidateNumber(int length) ???????{ ???????????int[] randMembers = new int[length]; ???????????int[] validateNums = new int[length]; ???????????System.Text.StringBuilder validateNumberStr = new System.Text.StringBuilder(); ???????????//生成起始序列值 ???????????int seekSeek = unchecked((int)DateTime.Now.Ticks); ???????????Random seekRand = new Random(seekSeek); ???????????int beginSeek = (int)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.Append(validateNums[i].ToString()); ???????????} ???????????return validateNumberStr.ToString(); ???????} ???????public byte[] CreateValidateGraphic(string validateNum) ???????{ ???????????Bitmap Img = null; ???????????Graphics g = null; ???????????MemoryStream ms = null; ???????????Random random = new Random(); ???????????//验证码颜色集合 ?????????????Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; ???????????//验证码字体集合 ???????????string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" }; ???????????//定义图像的大小,生成图像的实例 ?????????????Img = new Bitmap((int)validateNum.Length * 18, 32); ???????????g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象 ???????????????g.Clear(Color.White);//背景设为白色 ?????????????//在随机位置画背景点 ?????????????for (int i = 0; i < 100; i++) ???????????{ ???????????????int x = random.Next(Img.Width); ???????????????int y = random.Next(Img.Height); ???????????????g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1); ???????????} ???????????//验证码绘制在g中 ?????????????for (int i = 0; i < validateNum.Length; i++) ???????????{ ???????????????int cindex = random.Next(7);//随机颜色索引值 ?????????????????int findex = random.Next(5);//随机字体索引值 ?????????????????Font f = new Font(fonts[findex], 15, FontStyle.Bold);//字体 ?????????????????Brush b = new SolidBrush(c[cindex]);//颜色 ?????????????????int ii = 4; ???????????????if ((i + 1) % 2 == 0)//控制验证码不在同一高度 ?????????????????{ ???????????????????ii = 2; ???????????????} ???????????????g.DrawString(validateNum.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符 ?????????????} ???????????ms = new MemoryStream();//生成内存流对象 ?????????????Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中 ?????????????//回收资源 ?????????????g.Dispose(); ???????????Img.Dispose(); ???????????return ms.ToArray(); ???????} ???}}
调用方法, Controller加一个方法, HTML里 <img id="cc_image" src="/product/ValidateCode" alt="点击切换验证码">
???????public ActionResult ValidateCode() ???????{ ???????????Captcha captcha = new Captcha(); ???????????var code = captcha.CreateValidateNumber(4); ???????????HttpContext.Session.SetString("ValidateCode", code); ???????????return File(captcha.CreateValidateGraphic(code), "image/jpeg"); ???????}
把旧系统迁移到.Net Core 2.0 日记 (13) --图形验证码
原文地址:https://www.cnblogs.com/zitjubiz/p/net_core_daily_13_System_Drawing_Captcha.html