C# 制作 Windows Forms 图形验证码(带干扰线)

简介: WinForms图形验证码利用Graphics绘制字符、干扰线与噪点,支持刷新及随机颜色、旋转,增强防破解能力,提升安全性。

WinForms 图形验证码更直观,通过 Graphics 绘制字符、干扰线、噪点,提升安全性。

案例:WinForms 图形验证码生成

  1. 新建 Windows Forms 项目,添加 PictureBox(命名为 pbCaptcha)和 Button(命名为 btnRefresh)。
  2. 代码实现:
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace WinFormsCaptcha
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 初始化生成验证码
            GenerateCaptchaImage();
        }
        // 生成图形验证码
        private void GenerateCaptchaImage()
        {
            int width = pbCaptcha.Width;
            int height = pbCaptcha.Height;
            // 创建位图
            using (Bitmap bitmap = new Bitmap(width, height))
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                // 设置背景色(浅色)
                g.Clear(Color.AliceBlue);
                // 绘制干扰线(5条随机线)
                Random random = new Random();
                Pen pen = new Pen(Color.LightGray, 1);
                for (int i = 0; i < 5; i++)
                {
                    int x1 = random.Next(width);
                    int y1 = random.Next(height);
                    int x2 = random.Next(width);
                    int y2 = random.Next(height);
                    g.DrawLine(pen, x1, y1, x2, y2);
                }
                // 绘制噪点(100个随机点)
                for (int i = 0; i < 100; i++)
                {
                    int x = random.Next(width);
                    int y = random.Next(height);
                    bitmap.SetPixel(x, y, Color.FromArgb(random.Next(256), random.Next(256), random.Next(256)));
                }
                // 生成4位验证码
                string captcha = GenerateCaptchaText(4);
                // 存储验证码(用于后续验证)
                pbCaptcha.Tag = captcha;
                // 绘制验证码文字(随机字体、颜色、位置)
                Font font = new Font("Arial", 20, FontStyle.Bold | FontStyle.Italic);
                Brush[] brushes = { Brushes.Red, Brushes.Blue, Brushes.Green, Brushes.Orange };
                for (int i = 0; i < captcha.Length; i++)
                {
                    // 每个字符随机颜色、轻微旋转
                    Brush brush = brushes[random.Next(brushes.Length)];
                    float angle = random.Next(-15, 15); // 旋转角度
                    g.TranslateTransform(width / 4 * i + 10, height / 2);
                    g.RotateTransform(angle);
                    g.DrawString(captcha[i].ToString(), font, brush, 0, 0);
                    g.RotateTransform(-angle);
                    g.TranslateTransform(-(width / 4 * i + 10), -height / 2);
                }
                // 设置图片到PictureBox
                pbCaptcha.Image = new Bitmap(bitmap);
            }
        }
        // 生成验证码文本(字母+数字)
        private string GenerateCaptchaText(int length)
        {
            string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            Random random = new Random();
            char[] captchaChars = new char[length];
            for (int i = 0; i < length; i++)
            {
                captchaChars[i] = chars[random.Next(chars.Length)];
            }
            return new string(captchaChars);
        }
        // 刷新验证码按钮点击事件
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            GenerateCaptchaImage();
        }
        // 验证按钮点击事件(可添加TextBox输入验证)
        private void btnVerify_Click(object sender, EventArgs e)
        {
            string input = txtInput.Text.Trim();
            string captcha = pbCaptcha.Tag.ToString();
            if (string.Equals(input, captcha, StringComparison.OrdinalIgnoreCase))
            {
                MessageBox.Show("验证码正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("验证码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                GenerateCaptchaImage(); // 错误后刷新验证码
                txtInput.Clear();
            }
        }
    }
}

功能说明:支持刷新验证码、干扰线 + 噪点防破解、字符旋转 + 随机颜色,用户输入后验证。

相关文章
|
2天前
|
安全 C#
C# 泛型:实现类型安全的通用代码
泛型通过类型参数(如T)实现类型通用性,可定义不指定具体类型的类或方法,使用时再确定类型。示例中,Swap&lt;T&gt;方法可交换任意同类型变量,List&lt;T&gt;集合避免装箱拆箱,提升性能与安全。
|
2天前
|
C#
C# 字符串操作:常用方法汇总(含案例)
C# 提供丰富的字符串操作方法,如拼接、截取、替换和判断等。本文通过工具类案例演示如何高效处理字符串,提升开发效率与代码可读性。
|
2天前
|
算法 C# 容器
C# 实现简单的迭代器模式
迭代器模式提供一种顺序访问聚合对象元素的方法,无需暴露其内部结构。通过定义统一的迭代接口,实现对不同集合的遍历操作,增强容器的封装性和算法的复用性。
|
2天前
|
算法 C#
C# 实现字符串相似度计算(Levenshtein 算法)
介绍计算字符串编辑距离的算法,基于Levenshtein距离实现相似度分析,适用于搜索建议与拼写纠错,附C#代码示例。
|
2天前
|
C#
C# 异常处理:try-catch-finally 避免程序崩溃
异常处理用于捕获运行时错误(如空引用、文件不存在),确保程序稳定。通过 `try` 包裹可能出错的代码,`catch` 捕获并处理异常,`finally` 确保资源释放等操作始终执行,提升代码健壮性。
|
2天前
|
存储 安全 C#
C# 数组与集合:List<T> 最常用场景
数组长度固定,集合(List&lt;T&gt;)可动态增删,支持泛型与类型安全。常用操作包括添加、删除、遍历和查询元素,是开发中首选的动态数据存储方式。
|
2天前
|
C#
C# 实现简单的 Excel 数据写入工具
基于EPPlus库实现C#将数据写入Excel文件,支持自定义表头与多行数据,自动调整列宽,操作简便,适用于非商业场景的数据导出需求。
|
2天前
|
JSON API C#
C# 实现简单的 HTTP 请求工具(GET/POST)
HTTP请求工具用于调用第三方API,支持GET和POST方法,实现数据获取与提交。示例代码展示通过HttpClient发送异步POST请求,处理响应并解析JSON结果,适用于高效集成外部服务。
|
2天前
|
开发框架 .NET Java
C# LINQ:简化集合查询(基础用法)
LINQ是C#中集成的查询功能,可简洁高效地查询集合、数据库等数据源。通过示例演示了过滤、排序、分组、投影和聚合操作,展现其在处理产品列表时的强大与便捷。
|
2天前
|
C#
C# 实现对象深拷贝(序列化方式)
利用 BinaryFormatter 实现对象深拷贝,适用于复杂对象复制。需标记类为 [Serializable],通过序列化与反序列化实现完整克隆,确保成员独立。

热门文章

最新文章