首先展示一下效果图如下:

C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能。具体实现过程如下:

首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要的窗口添加控件即可)。

因为GDI工具绘制出的验证码是图片类型的,所以我们要添加一个picturebox控件。

这里我们编辑GDI的click事件,这样可以实现点击重新生成验证码。

1、验证码的位数可以自己随便设置。因为验证码是随机产生的,所以要使用到Random类。直接上代码(这里我选择的是生成4位验证码):

Random r = new Random();
string str = null;
for (int i = ; i < ; i++)
{
int rNumber = r.Next(, );
str += rNumber;
}

通过Random随机生成0~9的数字后将生成的四个数字加成一个字符串。

先加上MessageBox.Show(str)测试一下生成的随机数:

2、定义Bitmap(位图)和Graphics对象,并将Bitmap对象赋值给picturebox的Image属性

Bitmap bmp = new Bitmap(,);//设置长度和宽度分别为80和20
Graphics g = Graphics.FromImage(bmp);//Bitmap是Image的子类,所以可以替换Image放置在函数中
pictureBox1.Image = bmp;

3、将产生的字符串添加到Bitmap对象中

for (int i = ; i < ; i++)
{
Point p = new Point(i*,);
string[] fonts={"微软雅黑","宋体","黑体","隶书","仿宋"};
Color[] colors = {Color.Blue,Color.Black,Color.Red,Color.Green};
g.DrawString(str[i].ToString(),new Font(fonts[r.Next(,)],,FontStyle.Bold),new SolidBrush(colors[r.Next(,)]),p);
}
  • 这里的fonts和colors数组是我们可以限制生成的验证码字体和颜色是数组中类型的一种,当然也可以不设置,系统会自动分配随机字体和颜色。
  • 注意Point p = new Point(i*20,0);这句话是为了防止生成的验证码有数字重叠,因为如果不给它设置点的横纵坐标,系统会随机分配,所以难免会出现横纵坐标一致的情况,这样就导致了数字重叠。给它设置横坐标为i*20之后,第一个点的坐标就是(0,0),第二个是(20,0)这样保证它们不会重叠。

这里首先看一下目前的效果:

到目前为止已经基本实现随机生成验证码了,如果感觉不够复杂(太清楚了),下面还有步骤:

4、使用Graphics中的DrawLine(Point p1,Point p2)函数实现画线。所以首先需要定义两个点p1,p2(两点确定一条直线),但是限制条件是横纵坐标都不能超过bmp(前面创建的Bitmap对象)的长和宽。所以我们这样定义(先画10条线):

for (int i = ; i < ; i++)
{
Point p1 = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
Point p2 = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
g.DrawLine(new Pen(Brushes.Green),p1,p2);
}

看一下效果图:

这样基本已经可以了,起码对机器有点干扰性。

觉得还不够?还有最后一步:

5、加上像素颗粒。同样随机生成像素点,横纵坐标都不能超过bmp的长和宽,先加上100个试试。

for (int i = ; i < ; i++)
{
Point p = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
bmp.SetPixel(p.X,p.Y,Color.Black);
}

看一下效果:

到现在已经完成了一个比较正规的验证码了。虽然用到的东西不少,但是仔细分析分析就发现其实实现过程并没有想象的那么复杂。

最后附上完整代码:

        private void pictureBox1_Click(object sender, EventArgs e)
{
Random r = new Random();
string str = null;
for (int i = ; i < ; i++)
{
int rNumber = r.Next(, );
str += rNumber;
}
//MessageBox.Show(str); Bitmap bmp = new Bitmap(,);//设置长度和宽度分别为80和20
Graphics g = Graphics.FromImage(bmp);//Bitmap是Image的子类,所以可以替换Image放置在函数中 for (int i = ; i < ; i++)
{
Point p = new Point(i*,);
string[] fonts={"微软雅黑","宋体","黑体","隶书","仿宋"};
Color[] colors = {Color.Blue,Color.Black,Color.Red,Color.Green};
g.DrawString(str[i].ToString(),new Font(fonts[r.Next(,)],,FontStyle.Bold),new SolidBrush(colors[r.Next(,)]),p);
} //画线,可以不要
for (int i = ; i < ; i++)
{
Point p1 = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
Point p2 = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
g.DrawLine(new Pen(Brushes.Green),p1,p2);
} for (int i = ; i < ; i++)
{
Point p = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
bmp.SetPixel(p.X,p.Y,Color.Black);
}
pictureBox1.Image = bmp;
}

C#验证码 使用GDI绘制验证码的更多相关文章

  1. 通过GDI+绘制 验证码

    只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...

  2. Winform之GDI绘制验证码

    主要功能:点击验证码可更换,输入验证码进行登陆 需要导入命名空间System.Drawing; 产生五位的随机字符串: 1 Random random = new Random(); //产生5个随机 ...

  3. GDI+在绘制验证码中的使用

    GDI+最简单的理解就是用来绘图的.其中包括点.直线.矩形.字符串等等. 先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失. using System; ...

  4. 利用GDI+在Winfrom绘制验证码

    string yzm: private void yangzhengma() { Bitmap bt = new Bitmap(70,22);//创建位图对象 Graphics gs = Graphi ...

  5. PHP 绘制验证码

    使用PHP绘制验证码  可直接使用 // 验证码 <?php $checkCode = ""; for ($i=0; $i < 4; $i++) { // 十进制转换为 ...

  6. 用canvas绘制验证码

    在通常的登录界面我们都可以看到验证码,验证码的作用是检测是不是人在操作,防止机器等非人操作,防止数据库被轻而易举的攻破. 验证码一般用PHP和java等后端语言编写: 但是在前端,用canva或者SV ...

  7. java Web 请求servlet绘制验证码简单例子

    主要用来了解java代码怎么绘制验证码图片,实际开发中不会这样用 protected void doGet(HttpServletRequest request, HttpServletRespons ...

  8. 使用Java绘制验证码

    效果图: JDemo.java import java.io.File; import java.io.IOException; import static java.lang.System.out; ...

  9. 转:Java生成图片验证码(有点仿QQ验证码的意思)

    http://blog.csdn.net/ruixue0117/article/details/22829557 java: VerifyCodeUtils.java package com.fro. ...

随机推荐

  1. 怎么样运行jar

    一.制作jar文件 在制作.jar 文件之前你必须先编译好你的.java文件.假设我们的文件目录是c:javamyJavahelloHello.java 现在假设Hello.java的文件内容为: / ...

  2. java程序员,英语那点事

    本文选自<Java程序员,上班那点事儿>有时候如果应聘到了一个有外资背景的公司或者这个公司的很多人都有海外或外资工作背景时,你 也许还会用到一些日常工作交流时候的词汇.        比如 ...

  3. RadioButton 用法

    @Html.RadioButton("rdoNotice", "1ST", true, new { id = "rdoFirstNotice" ...

  4. Codeforces 1196D2 RGB Substring (Hard version) 题解

    题面 \(q\) 个询问,每个询问给出一个字符串 \(s\),要你在 \(s\) 中用最小替换得到无穷字符串 RGBRGBRGB... 的长度为定值 \(k\) 的子串. 题解 一眼看过去可能是编辑距 ...

  5. 使用MyCat实现MySQL读写分离

    说明 配置MyCat读写分类前需要先配置MySQL的主从复制,参考我上一篇的文章,已经做了比较详细地讲解了. 环境 centos7.MySQL5.7.mycat1.6 配置MyCat账号密码和数据库名 ...

  6. 关于Simulink的sample time的问题

    在对simulink建模的过程中,有时候会遇到sample time出现错误的问题,比如下图是我在使用simulink自带的Recursive least square Estimator最小二乘估计 ...

  7. 《React后台管理系统实战 :二》antd左导航:cmd批量创建子/目录、用antd进行页面布局、分离左导航为单独组件、子路由、动态写左导航、css样式相对陷阱

    一.admin页面布局及路由创建 0)cmd批量创建目录及子目录 //创建各个目录,及charts和子目录bar md home category product role user charts\b ...

  8. sqlplus 登陆使用

    select * from dept; input order by dname;  追加文本命令  del  n  删除语句 celar buffer ; 清除缓冲区的命令 conn sys as ...

  9. android 基础学习(6)-----sqlite3查看表结构

    原文:http://blog.csdn.net/richnaly/article/details/7831933 sqlite3查看表结构 在android下通过adb shell命令可以进入sqli ...

  10. SciPy 常量

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...