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

news2024/12/24 2:20:19

目录

下面是代码的详细解释:

类声明和成员变量

 构造函数

窗体加载事件

 生成验证码方法

 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 类来绘制图像,并在用户操作(如点击图片或验证按钮)时响应事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# Windows Forms实现绘制画板

目录 C# Windows Forms上绘制画板&#xff1a; 详细解释&#xff1a; TempData临时数据&#xff0c;用来保存画笔相关的信息&#xff0c;如&#xff1a;颜色&#xff0c;大小&#xff0c;坐标等 类声明和成员变量 构造函数 文件菜单项点击事件 保存菜单项点击事件 画笔大…

浙大数据结构:03-树2 List Leaves

这道题我借用了一点上一题的代码思路&#xff0c;这题考察的主要是层序遍历&#xff0c;即用队列来实现&#xff0c;当然此处我依然采用数组模拟队列来实现。 机翻 1、条件准备 map的键存下标&#xff0c;后面值分别存左右子树的下标&#xff0c;没有子树就存-1. head数组只…

python脚本源码如何使用PyOxidizer编译Windows可执行文件

使用 PyOxidizer 将上述代码编译为 Windows 可执行文件&#xff0c;可以按照以下步骤进行&#xff1a; 一、准备工作 确保已经安装了 PyOxidizer 和 Rust 开发环境&#xff0c;如前文所述。 二、创建 PyOxidizer 配置文件 创建一个名为pyoxidizer.toml的配置文件&#xff0c;内…

go急速入门API开发

go急速入门 1、安装Go和对应编辑器2、编写helloWord3、项目目录开发4、编写一个http服务器5、 使用Gin框架基本使用使用部分中间件自定义中间件 6、部署 1、安装Go和对应编辑器 go官网&#xff0c;下载自己电脑对应版本即可。安装完成之后打开cmd输入go即可弹出对应提示。 对…

ffmpeg(各个系统版本安装- Windows11-Mac-Linux)

各个系统上的安装不建议使用编译安装&#xff0c;大佬的话可以 编译安装会各种环境问题&#xff0c;直接使用别人安装好的就行 1.Windows11上安装ffmpeg 1.官网下载ffmpeg 进入Download FFmpeg网址&#xff0c;点击下载windows版ffmpeg&#xff0c;使用别人编译好的版本即可 …

文法的例题

答案&#xff1a;B 知识点&#xff1a; 文法 一个形式文法是一个有序四元组G{V,T,S,P}&#xff0c;其中&#xff1a; V&#xff1a;非终结符。不是语言组成部分&#xff0c;不是最终结果&#xff0c;可理解为占位符 T&#xff1a;终结符。是语言的组成部分&#xff0c;是最…

自用NAS系列1-设备

拾光坞 拾光坞多账号绑定青龙面板SMBWebdav小雅alist下载到NASDocker安装迅雷功能利用qBittorrentEEJackett打造一站式下载工具安装jackett插件 外网访问内网拾光客户端拾光穿透公网ipv6路由器配置ipv6拾光坞公网验证拾光坞域名验证 拾光坞 多账号绑定 手机注册拾光坞账号&am…

Web Bluetooth 与点对点连接

前言 需求需要实现手持终端设备与 web 网页的点对点数据传输&#xff0c;不希望有服务器参与&#xff0c;想到了 web 的 USB 与 Bluetooth API&#xff0c;对 Web Bluetooth API 进行了研究。 蓝牙 GATT 基础知识 GATT&#xff08;通用属性配置文件&#xff0c;蓝牙低功耗&a…

K8S 发布应用

前言 昨儿个用 unbuntu20.04 又装了一次K8S 用的 kubeadm containerd Cilium (CNI) 又重新撸了一遍 这里只记录 应用发布的笔记 正文 #创建deployment kubectl create deployment nginx --imagenginx #我这边大约30秒后显示为 ready kubectl get deployments kubectl desc…

4.7 Sensors -- useScroll

4.7 Sensors – useScroll https://vueuse.org/core/useScroll/ 作用 响应式的监听滚动位置和状态。 官方示例 <script setup lang"ts"> import { useScroll } from vueuse/coreconst el ref<HTMLElement | null>(null) const { x, y, isScrolling…

【Python系列】只更新非空的字段

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “”阻塞赋值&#xff0c; ”<”非阻塞赋值。阻塞赋值为执行完一条赋值语句&#xff0c;再执行下一条&#xff0c;可理解为顺序执行&#xff0c;而且赋值是立即执行&#xff1b; 非阻塞赋值可理解为并行执行&#xff0c;不考虑顺序&#x…

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索&#xff08;CBIR&#xff09;从文本挖掘中获取灵感——矢量空间模型&#xff08;BOW表示模型&#xff09;7.2 视觉单词**思想****特征提取**&#xff1a; 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加…

构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类

深度学习实践&#xff1a;构建并训练卷积神经网络&#xff08;CNN&#xff09;对CIFAR-10数据集进行分类 引言 在计算机视觉领域中&#xff0c;CIFAR-10数据集是一个经典的基准数据集&#xff0c;广泛用于图像分类任务。本文将介绍如何使用PyTorch框架构建一个简单的卷积神经…

微信小程序uniappvue3版本-控制tabbar某一个的显示与隐藏

1. 首先在pages.json中配置tabbar信息 2. 在代码根目录下添加 tabBar 代码文件 直接把微信小程序文档里面的四个文件复制到自己项目中就可以了 3. 根据自己的需求更改index.js文件 首先我这里需要判断什么时候隐藏某一个元素&#xff0c;需要引入接口 然后在切换tabbar时&#…

git:认识git和基本操作(1)

目录 一、版本控制器 1.安装git 2.创建git本地仓库 3.配置git 二、git操作&#xff08;1&#xff09; 1.工作区、暂存区、版本库 2.添加文件 3.查看.git 4.修改文件 一、版本控制器 所谓的版本控制器&#xff0c;就是能让你了解到每一个文件的修改历史。相应的&#x…

Maven的安装

一、安装 压缩包解压完的目录如下所示&#xff08;此处为绿色免安装版&#xff09;&#xff1a; &#xff08;其余三个文件是针对Maven版本&#xff0c;第三方软件等简要介绍&#xff09; 二、环境变量 前提&#xff1a; jdk最低版本为JAVA7&#xff08;即jdk17&#xff09…

R语言统计分析——重复测量方差分析

参考资料&#xff1a;R语言实战【第2版】 所谓重复测量方差分析&#xff0c;即受试者被测量不止一次。本例使用数据集市co2数据集&#xff1a;因变量是二氧化碳吸收量&#xff08;uptake&#xff09;&#xff0c;自变量是植物类型&#xff08;Type&#xff09;和七种水平的二氧…

Gitness 基础安装

文章目录 Docker 安装注册账户创建项目导入已有仓库配置 Github Token同步源代码仓库 官方链接 Gitness was the next step in the evolution of Drone, from continuous integration to source code hosting, bringing code management and pipelines closer together. Gitnes…

自动化表格处理的革命:智能文档系统技术解析

在当今数据驱动的商业环境中&#xff0c;表格数据的自动化处理成为了企业提高效率、降低成本的关键。企业智能文档系统在智能表格识别方面展现出卓越的性能&#xff0c;通过精准识别和处理各种通用表格&#xff0c;显著提升了企业文档管理的智能化水平。本文将深入探讨该系统在…