• 把旧系统迁移到.Net Core 2.0 日记 (13) --图形验证码


    参考这篇文章: 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");
            }
  • 相关阅读:
    Windows 下安装 Python + Django
    asp.net core 一个中小型项目实战的起手式——Swagger配置
    asp.net core 一个中小型项目实战的起手式——项目搭建与仓储模式下的持久层创建(1)
    c#一些常用知识点
    ADO.NET中的5个主要对象
    JavaScript的闭包特性如何给循环中的对象添加事件(一)
    在什么情况下会用到虚方法?它与接口有什么不同?
    一般处理程序Session
    什么是code-Behind技术?
    什么是事务?
  • 原文地址:https://www.cnblogs.com/zitjubiz/p/net_core_daily_13_System_Drawing_Captcha.html
Copyright © 2020-2023  润新知