陈程的技术博客

  • 关于作者
全栈软件工程师
一个专注于技术研究创新的程序员
  1. 首页
  2. .NET
  3. 正文

自己写了个C# 生成简单验证码和加减算法验证码

2016年3月7日 693点热度 0人点赞 0条评论

自己写了个C# 生成简单验证码和加减算法验证码 

思路:

1.随机生成数字或字母,如果是加减验证码的话生成数字和 + -

2.绘制到Image上

3.随机生成位置,在上面绘制大小为1,1的噪点,绘制多少看具体效果。一般100~200左右。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;

namespace Controller
{
    /// <summary>
    /// 验证码帮助类
    /// </summary>
    public class CheckCodeHelper
    {
        /// <summary>
        /// 验证码长度
        /// </summary>
        public int CodeWidth;

        /// <summary>
        /// 验证码高度
        /// </summary>
        public int CodeHeight;

        /// <summary>
        /// 验证码结果值
        /// </summary>
        public string ReturnValue;

        public CheckCodeHelper(int width, int height)
        {
            CodeWidth = width;
            CodeHeight = height;
            ReturnValue = null;
        }

        /// <summary>
        /// 生成随机数字
        /// </summary>
        /// <returns></returns>
        private string GenerateNumbers(int count)
        {
            string strOut = "";
            Random random = new Random();
            for (int i = 0; i < count; i++)
            {
                string num = Convert.ToString(random.Next(10000) % 10);
                strOut += num;
            }
            return strOut.Trim();
        }

        /// <summary>
        /// 生成随机字符
        /// </summary>
        /// <returns></returns>
        private string GenerateCharacters(int count)
        {
            string strOut = "";
            Random random = new Random();
            for (int i = 0; i < count; i++)
            {
                string num = Convert.ToString((char)(65 + random.Next(10000) % 26));
                strOut += num;
            }
            return strOut.Trim();
        }

        private string GetNumAndStrCharacters(int count)
        {
            string outStr = "";

            string nums = GenerateNumbers(count);
            string str = GenerateCharacters(count);

            Random random = new Random();
            string value = nums + str;
            for (int i = 0; i < count; i++)
            {
                outStr += value.Substring(random.Next(0, value.Length), 1);
            }
            ReturnValue = outStr;
            return outStr;
        }

        /// <summary>
        /// 获取加减计算验证码
        /// </summary>
        /// <returns></returns>
        private string GetMathNumbers()
        {
            string strOut = "";
            int ValueOut = 0;
            Random random = new Random();
            int number = random.Next(0, 30);
            int number2 = random.Next(0, 30);
            int DectX = random.Next(0, 100) % 2;
            if (DectX == 0)
            {
                strOut = number + " + " + number2;
                ValueOut = number + number2;
            }
            else
            {
                if (number >= number2)
                {
                    strOut = number + " - " + number2;
                    ValueOut = number - number2;
                }
                else
                {
                    strOut = number2 + " - " + number;
                    ValueOut = number2 - number;
                }
            }
            ReturnValue = ValueOut.ToString();
            return strOut;
        }

        /// <summary>
        /// 创建加减计算的验证码
        /// </summary>
        /// <returns></returns>
        public Image CreateMathImage()
        {
            Bitmap bmp = new Bitmap(CodeWidth, CodeHeight);

            Graphics graph = Graphics.FromImage(bmp);
            Color[] penColors = new Color[] { Color.Black, Color.Red, Color.Blue, Color.Green, Color.HotPink };
            Color[] colors = new Color[] { Color.Black, Color.Red, Color.Blue, Color.Green, Color.HotPink, Color.Yellow };
            FontStyle[] fontStyles = new FontStyle[] { FontStyle.Regular, FontStyle.Bold, FontStyle.Italic };

            Random random = new Random();
            string number = GetMathNumbers();

            for (int i = 0; i < number.Length; i++)
            {
                Font font = new Font("宋体", random.Next(12, 16), fontStyles[random.Next(0, fontStyles.Length)]);
                Color color = penColors[random.Next(0, penColors.Length)];
                graph.DrawString(number.Substring(i, 1), font, new SolidBrush(color), (i * 10), 5);

            }
            //加噪点
            for (int i = 0; i < 200; i++)
            {
                Color color = colors[random.Next(0, colors.Length)];
                graph.FillRectangle(new SolidBrush(color), random.Next(0, CodeWidth), random.Next(0, CodeHeight), 1, 1);
            }
            graph.Dispose();
            return bmp;
        }

        /// <summary>
        /// 创建字符和数字的验证码
        /// </summary>
        /// <returns></returns>
        public Image CreateNumAndStrImage()
        {
            Bitmap bmp = new Bitmap(CodeWidth, CodeHeight);

            Graphics graph = Graphics.FromImage(bmp);
            Color[] penColors = new Color[] { Color.Black, Color.Red, Color.Blue, Color.Green, Color.HotPink };
            Color[] colors = new Color[] { Color.Black, Color.Red, Color.Blue, Color.Green, Color.HotPink, Color.Yellow };
            FontStyle[] fontStyles = new FontStyle[] { FontStyle.Regular, FontStyle.Bold, FontStyle.Italic };

            Random random = new Random();
            string number = GetNumAndStrCharacters(4);

            for (int i = 0; i < number.Length; i++)
            {
                Font font = new Font("宋体", random.Next(14, 20), fontStyles[random.Next(0, fontStyles.Length)]);
                Color color = penColors[random.Next(0, penColors.Length)];
                graph.DrawString(number.Substring(i, 1), font, new SolidBrush(color), (i * 18), 5);

            }
            //加噪点
            for (int i = 0; i < 200; i++)
            {
                Color color = colors[random.Next(0, colors.Length)];
                graph.FillRectangle(new SolidBrush(color), random.Next(0, CodeWidth), random.Next(0, CodeHeight), 1, 1);
            }
            graph.Dispose();
            return bmp;
        }
    }
}

 

标签: C#
最后更新:2021年4月1日

博主

全栈工程师,侧重项目技术解决方案规划和开发

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

分类
  • .NET (65)
  • docker (3)
  • linux (12)
  • python (20)
  • web (14)
  • 小程序 (4)
  • 数据库 (2)
  • 未分类 (4)
  • 杂七杂八 (10)
标签聚合
centos python linux winform nginx DevExpress js C#
最新 热点 随机
最新 热点 随机
.NET开发手册标准参考 招募兼职前端开发 Centos安装dotnet6环境 VS上切换分支,vs编译运行出现bug,A fatal error was encountered彻底解决方案 用C#封装一个线程安全的缓存器,达到目标定时定量更新入库 C#通过特性的方式去校验指定数据是否为空
ListHelper帮助类,DataTable和List之间转换 VS上切换分支,vs编译运行出现bug,A fatal error was encountered彻底解决方案 关于使用webBrowser操作HTML的帮助类 检测图片是否是空白页,GetPixel高效处理 winform应用程序幻灯片设计 用C#写基于用户的协同过滤算法,推荐网站上你可能感兴趣的人

COPYRIGHT © 2021 陈程的技术博客. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS