• C#生成验证码


    生成验证码的类:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Text;
    
    namespace Controllers.Core.Util
    {
        /// <summary>
        /// 验证码
        /// </summary>
        public class VerifyCodeHelper : AdminBaseController
        {
            #region 变量
            /// <summary>
            /// 颜色表
            /// </summary>
            private static Color[] colors = new Color[]{
                Color.FromArgb(220,20,60),
                Color.FromArgb(128,0,128),
                Color.FromArgb(65,105,225),
                Color.FromArgb(70,130,180),
                Color.FromArgb(46,139,87),
                Color.FromArgb(184,134,11),
                Color.FromArgb(255,140,0),
                Color.FromArgb(139,69,19),
                Color.FromArgb(0,191,255),
                Color.FromArgb(95,158,160),
                Color.FromArgb(255,20,147),
                Color.FromArgb(255,165,0)};
    
            /// <summary>
            /// 字体表
            /// </summary>
            private static string[] fonts = new string[] { 
                "Arial",
                "Verdana", 
                "Georgia", 
                "黑体" };
    
            /// <summary>
            /// 字体大小
            /// </summary>
            private static int fontSize = 22;
            #endregion
    
            #region 生成验证码图片
            /// <summary>
            /// 生成验证码图片
            /// </summary>
            public static Bitmap CreateVerifyCodeBmp(out string code)
            {
                int width = 120;
                int height = 40;
                Bitmap bmp = new Bitmap(width, height);
                Graphics g = Graphics.FromImage(bmp);
                Random rnd = new Random();
    
                //背景色
                g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, width, height));
    
                //文字
                StringBuilder sbCode = new StringBuilder();
                for (int i = 0; i < 4; i++)
                {
                    string str = GetChar(rnd);
                    Font font = GetFont(rnd);
                    Color color = GetColor(rnd);
                    g.DrawString(str, font, new SolidBrush(color), new PointF((float)(i * width / 4.0), 0));
                    sbCode.Append(str);
                }
                code = sbCode.ToString();
    
                //噪音线
                for (int i = 0; i < 10; i++)
                {
                    int x1 = rnd.Next(bmp.Width);
                    int x2 = rnd.Next(bmp.Width);
                    int y1 = rnd.Next(bmp.Height);
                    int y2 = rnd.Next(bmp.Height);
    
                    Pen p = new Pen(GetColor(rnd), 1);
                    g.DrawLine(p, x1, y1, x2, y2);
                }
    
                //扭曲
                bmp = TwistImage(bmp, true, 3, rnd.NextDouble() * Math.PI * 2);
                g = Graphics.FromImage(bmp);
    
                //噪点
                for (int i = 0; i < 100; i++)
                {
                    int x1 = rnd.Next(bmp.Width);
                    int y1 = rnd.Next(bmp.Height);
    
                    Pen p = new Pen(GetColor(rnd), 1);
                    g.DrawRectangle(p, x1, y1, 1, 1);
                }
    
                //边框
                g.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(153, 153, 153))), new Rectangle(0, 0, width - 1, height - 1));
    
                return bmp;
            }
            #endregion
    
            #region 获取随机字符
            /// <summary>
            /// 获取随机字符
            /// </summary>
            private static string GetChar(Random rnd)
            {
                int n = rnd.Next(0, 61);
                if (n <= 9)
                {
                    return ((char)(48 + n)).ToString();
                }
                else if (n <= 35)
                {
                    return ((char)(65 + n - 10)).ToString();
                }
                else
                {
                    return ((char)(97 + n - 36)).ToString();
                }
            }
            #endregion
    
            #region 获取随机字体
            /// <summary>
            /// 获取随机字体
            /// </summary>
            private static Font GetFont(Random rnd)
            {
                return new Font(fonts[rnd.Next(0, fonts.Length)], fontSize, FontStyle.Bold);
            }
            #endregion
    
            #region 获取随机颜色
            /// <summary>
            /// 获取随机颜色
            /// </summary>
            private static Color GetColor(Random rnd)
            {
                return colors[rnd.Next(0, colors.Length)];
            }
            #endregion
    
            #region 正弦曲线Wave扭曲图片
            /// <summary>   
            /// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)   
            /// </summary>   
            /// <param name="srcBmp">图片路径</param>   
            /// <param name="bXDir">如果扭曲则选择为True</param>   
            /// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>   
            /// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>   
            private static 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 ? (Math.PI * 2 * (double)j) / dBaseAxisLen : (Math.PI * 2 * (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
    
        }
    }
    View Code

    验证码页面Action:

    public ActionResult VerifyCode()
    {
        string code;
        Bitmap bmp = VerifyCodeHelper.CreateVerifyCodeBmp(out code);
        Bitmap newbmp = new Bitmap(bmp, 108, 36);
        HttpContext.Session["VerifyCode"] = code;
    
        Response.Clear();
        Response.ContentType = "image/bmp";
        newbmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Bmp);
    
        return View();
    }
    View Code

    说明:前台页面为空的cshtml页面,验证码的值放在Session中。

    使用验证码的页面:

    显示验证码的img:

    <img id="verifyCode" src="" alt="验证码" style="vertical-align: middle;" />

    页面加载完成后,显示验证码(注意,要加上时间戳,不然刷新页面时验证码不刷新):

    $(function () {
        //刷新验证码
        $("#refreshVerifyCode").click(function () {
            refreshVerifyCode(); //刷新验证码
        });
        $("#verifyCode").click(function () {
            refreshVerifyCode(); //刷新验证码
        });
        refreshVerifyCode();
    });

    刷新验证码:

    //刷新验证码
    function refreshVerifyCode() {
        $("#verifyCode").attr("src", "VerifyCode?t=" + new Date().valueOf());
    }

    判断用户输入的文本是否与验证码相同的Action:

    public ActionResult CheckVCode(string vcode)
    {
        if (HttpContext.Session["VerifyCode"].ToString().ToLower() == vcode.ToLower())
        {
            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic["ok"] = true;
            return Content(JsonConvert.SerializeObject(dic));
        }
        else
        {
            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic["ok"] = false;
            return Content(JsonConvert.SerializeObject(dic));
        }
    }
    View Code
  • 相关阅读:
    Leetcode 240. 搜索二维矩阵 II 中等 数组
    Leetcode 301. 删除无效的括号 困难 bfs
    Leetcode 208. 实现 Trie (前缀树)
    Leetcode 338. 比特位计数 简单 数学计算
    Leetcode 279. 完全平方数 中等 动态规划
    浅谈std::move和std::forward原理 (转)
    Leetcode 221. 最大正方形 中等 动态规划
    Leetcode 238. 除自身以外数组的乘积 中等 数组
    Leetcode 347. 前 K 个高频元素 中等 堆排序
    Leetcode 287. 寻找重复数 中等 数组 快慢指针
  • 原文地址:https://www.cnblogs.com/s0611163/p/4192377.html
Copyright © 2020-2023  润新知