C#使用GDI+实现生成验证码

目录

下面是代码的详细解释:

类声明和成员变量

 构造函数

窗体加载事件

 生成验证码方法

 pictureBox1 点击事件

 按钮点击事件

完整代码:

总结


这段代码是一个C# Windows Forms应用程序的一部分,用于生成和验证验证码。

下面是代码的详细解释:

类声明和成员变量

  • Form1 类继承自 Form,表示一个Windows表单。
  • checkCode 是一个私有字符串变量,用于存储生成的验证码,以便与用户输入的数据进行比较。
    public partial class Form1 : Form
    {
        private string checkCode = string.Empty;

 构造函数

  • InitializeComponent 方法用于初始化窗体上
    public Form1()
    {
        InitializeComponent();
    }

窗体加载事件

  • 当窗体加载时,这个方法设置了一个工具提示,提示用户可以点击 pictureBox1 来重新生成验证码,并调用 GenCheckCode 方法生成一个包含5个字符的验证码图像。
    private void Form1_Load(object sender, EventArgs e)
    {
        toolTip1.SetToolTip(pictureBox1, "点击重新生成验证码");
        pictureBox1.Image = GenCheckCode(5);
    }

 生成验证码方法

  • GenCheckCode 方法生成一个包含指定数量字符的验证码图像。
  • 创建一个 Bitmap 对象,大小与 pictureBox1 相同。
  • 使用 Graphics 对象在 Bitmap 上绘制白色背景。
  • 定义一个包含字母和数字的字符串。
  • 使用 Random 类生成随机数,用于选择字符和颜色。
  • 使用 StringBuilder 构建验证码字符串。
  • 绘制每个字符,并随机设置字符的颜色和位置。
  • 定义一组 Pen 对象,用于绘制干扰线。
  • 绘制干扰线。
    private Bitmap GenCheckCode(int count)
    {
        int width = pictureBox1.Width;
        int height = pictureBox1.Height;
        Bitmap bitMap = new Bitmap(width, height);
        Graphics g = Graphics.FromImage(bitMap);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height);
    
        string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        Random r = new Random();
        StringBuilder s = new StringBuilder();
        Font font = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold, GraphicsUnit.Pixel);
    
        Color[] colors = {
            Color.Blue, Color.Green, Color.Red, Color.Orange,
            Color.Orchid,Color.Yellow,Color.Chocolate,Color.Brown,
            Color.Gold, Color.Black, Color.Gray, Color.DarkBlue
        };
    
        for (int i = 0; i < count; i++)
        {
            int colorIndex = r.Next(0, colors.Length);
            int letterIndex = r.Next(0, letters.Length);
            string letter = letters[letterIndex].ToString();
            s.Append(letter);
            g.DrawString(letter, font, new SolidBrush(colors[colorIndex]), i * 28, r.Next(0, 15));
        }
        checkCode = s.ToString();
    
        Pen[] pens = {
            new Pen(Color.Blue, 2){DashStyle=DashStyle.Solid},
            new Pen(Color.Green, 2){DashStyle=DashStyle.Dash},
            new Pen(Color.Red, 2){DashStyle=DashStyle.Dot},
            new Pen(Color.Orange, 2){DashStyle=DashStyle.DashDot},
            new Pen(Color.Orchid, 2){DashStyle=DashStyle.DashDotDot},
            new Pen(Color.Yellow, 2){DashStyle=DashStyle.Solid},
            new Pen(Color.Chocolate, 2){DashStyle=DashStyle.Dash},
            new Pen(Color.Brown, 2){DashStyle=DashStyle.Dot},
            new Pen(Color.Gold, 2){DashStyle=DashStyle.DashDot},
            new Pen(Color.Black, 2){DashStyle=DashStyle.DashDotDot},
            new Pen(Color.Gray, 2){DashStyle=DashStyle.DashDot},
            new Pen(Color.DarkBlue, 2){DashStyle=DashStyle.DashDotDot}
        };
        for (int i = 0; i < 10; i++)
        {
            int penIndex = r.Next(0,12);
            g.DrawLine(pens[penIndex], new Point(r.Next(0, width), r.Next(0, height)), new Point(r.Next(0, width), r.Next(0, height)));
        }
    
        return bitMap;
    }

 pictureBox1 点击事件

  • 当用户点击 pictureBox1 时,调用 GenCheckCode 方法重新生成验证码。
    private void pictureBox1_Click(object sender, EventArgs e)
    {
        pictureBox1.Image = GenCheckCode(5);
    }

 按钮点击事件

  • 当用户点击验证按钮时,这个方法会比较文本框 textBox1 中的文本与生成的验证码 checkCode 是否匹配,并显示相应的消
    private void button2_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == checkCode)
        {
            MessageBox.Show("输入的验证码正确!");
            return;
        }
        else
        {
            MessageBox.Show("验证码不正确,请重新输入!");
            return;
        }
    }

完整代码:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

namespace _2.验证码
{
    public partial class Form1 : Form
    {
        // 保存生成的验证码,和用户输入的数据进行比较。
        private string checkCode = string.Empty;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            toolTip1.SetToolTip(pictureBox1, "点击重新生成验证码");
            pictureBox1.Image = GenCheckCode(5);
        }

        /// <summary>
        /// 生成验证图片核心代码
        /// </summary>
        /// <param name="count">几位验证码</param>
        /// <returns>验证码</returns>
        private Bitmap GenCheckCode(int count)
        {
            //背景用白色填充
            int width = pictureBox1.Width;
            int height = pictureBox1.Height;
            Bitmap bitMap = new Bitmap(width, height);
            // 创建画板
            Graphics g = Graphics.FromImage(bitMap);
            // 画板用白色填充
            g.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height);

            //将随机生成的字符串绘制到图片上
            string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
            Random r = new Random();
            StringBuilder s = new StringBuilder();
            Font font = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold, GraphicsUnit.Pixel);

            Color[] colors = {
                Color.Blue, Color.Green, Color.Red, Color.Orange,
                Color.Orchid,Color.Yellow,Color.Chocolate,Color.Brown,
                Color.Gold, Color.Black, Color.Gray, Color.DarkBlue
            };
            for (int i = 0; i < count; i++)
            {
                // 产生颜色的随机索引 
                int colorIndex = r.Next(0, colors.Length); // 生成一个0到11的随机数
                // 产生是字符的随机索引
                int letterIndex = r.Next(0, letters.Length);
                string letter = letters[letterIndex].ToString();
                s.Append(letter);
                g.DrawString(letter, font, new SolidBrush(colors[colorIndex]), i * 28, r.Next(0, 15));
            }
            checkCode = s.ToString(); //先保存,将来验证与用户输入是否一致

            //生成干扰线条,混淆背景
            Pen[] pens = {
                new Pen(Color.Blue, 2){DashStyle=DashStyle.Solid},
                new Pen(Color.Green, 2){DashStyle=DashStyle.Dash},
                new Pen(Color.Red, 2){DashStyle=DashStyle.Dot},
                new Pen(Color.Orange, 2){DashStyle=DashStyle.DashDot},
                new Pen(Color.Orchid, 2){DashStyle=DashStyle.DashDotDot},
                new Pen(Color.Yellow, 2){DashStyle=DashStyle.Solid},
                new Pen(Color.Chocolate, 2){DashStyle=DashStyle.Dash},
                new Pen(Color.Brown, 2){DashStyle=DashStyle.Dot},
                new Pen(Color.Gold, 2){DashStyle=DashStyle.DashDot},
                new Pen(Color.Black, 2){DashStyle=DashStyle.DashDotDot},
                new Pen(Color.Gray, 2){DashStyle=DashStyle.DashDot},
                new Pen(Color.DarkBlue, 2){DashStyle=DashStyle.DashDotDot}
            };
            for (int i = 0; i < 10; i++)
            {
                int penIndex = r.Next(0,12); // 生成一个0到11的随机数

                g.DrawLine(pens[penIndex], new Point(r.Next(0, width), r.Next(0, height)), new Point(r.Next(0, width), r.Next(0, height)));
            }

            return bitMap;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = GenCheckCode(5);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == checkCode)
            {
                MessageBox.Show("输入的验证码正确!");
                return;
            }
            else
            {
                MessageBox.Show("验证码不正确,请重新输入!");
                return;
            }
        }

        
    }
}

总结

这个程序的主要功能是生成一个包含随机字符和干扰线的验证码图像,并允许用户输入验证码进行验证。它使用了 Graphics 类来绘制图像,并在用户操作(如点击图片或验证按钮)时响应事件。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值