C#验证码 使用GDI绘制验证码
首先展示一下效果图如下:
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绘制验证码的更多相关文章
- 通过GDI+绘制 验证码
只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...
- Winform之GDI绘制验证码
主要功能:点击验证码可更换,输入验证码进行登陆 需要导入命名空间System.Drawing; 产生五位的随机字符串: 1 Random random = new Random(); //产生5个随机 ...
- GDI+在绘制验证码中的使用
GDI+最简单的理解就是用来绘图的.其中包括点.直线.矩形.字符串等等. 先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失. using System; ...
- 利用GDI+在Winfrom绘制验证码
string yzm: private void yangzhengma() { Bitmap bt = new Bitmap(70,22);//创建位图对象 Graphics gs = Graphi ...
- PHP 绘制验证码
使用PHP绘制验证码 可直接使用 // 验证码 <?php $checkCode = ""; for ($i=0; $i < 4; $i++) { // 十进制转换为 ...
- 用canvas绘制验证码
在通常的登录界面我们都可以看到验证码,验证码的作用是检测是不是人在操作,防止机器等非人操作,防止数据库被轻而易举的攻破. 验证码一般用PHP和java等后端语言编写: 但是在前端,用canva或者SV ...
- java Web 请求servlet绘制验证码简单例子
主要用来了解java代码怎么绘制验证码图片,实际开发中不会这样用 protected void doGet(HttpServletRequest request, HttpServletRespons ...
- 使用Java绘制验证码
效果图: JDemo.java import java.io.File; import java.io.IOException; import static java.lang.System.out; ...
- 转:Java生成图片验证码(有点仿QQ验证码的意思)
http://blog.csdn.net/ruixue0117/article/details/22829557 java: VerifyCodeUtils.java package com.fro. ...
随机推荐
- 修改DUILIB任务栏中显示的图标和EXE图标
在资源中添加ICO图标,获取属性名,在主窗口文件中的函数InitWindow或OnCreate中添加如下代码: SetIcon(IDR_MAINFRAME); 修改EXE显示图标,在主窗口中加入如下代 ...
- JS截取腾讯视频和去除视频广告
一:腾讯视频截取 H5视频播放除了video标签以外,还有iframe嵌套视频 项目需求是用户输入腾讯视频的html链接,如 https://v.qq.com/x/page/y0116k2vspw.h ...
- English-Number
English-Number 1. 基数与序数 2. 数量级前缀 3. 与数量级前缀连用的常用单位 4. 数量的完整写法式例 5. 数学符号 6. 其他常用单位 7. 数字的用法 7.1 日期时间 7 ...
- js select下拉框下拉跳转代码
下拉跳转原理很简单这个用到了select的onchangeg事件,只要这里改变我们就获取select值直接location.href=this.value即可. <select name=&qu ...
- 车林通购车之家--购车计算器模块js实现
//jsq-nav.twig <ul class="switch-nav db-tags bgfff clearfix"> <li id="qk&quo ...
- VScode禁用alt+key触发菜单栏快捷键
因为用惯了Mac,突然改回Windows,但是已经习惯了按Command键.所以在Windows下把vscode的快捷键全改成alt+key了.但是Windows的alt+key快捷键就比较烦人了.所 ...
- nosql概叙
关系型数据库管理系统:按照预先设置的组织架构,将数据存储在物理介质上 数据之间可以做关联操作
- 机器学习算法中的网格搜索GridSearch实现(以k-近邻算法参数寻最优为例)
机器学习算法参数的网格搜索实现: //2019.08.031.scikitlearn库中调用网格搜索的方法为:Grid search,它的搜索方式比较统一简单,其对于算法批判的标准比较复杂,是一种复合 ...
- loadrunner-11安装+破解+汉化
一.loadrunner-11安装下载地址:链接:https://pan.baidu.com/s/10meUz5DfkS8WleLSOalCtQ 提取码:iw0p 由于LR11安装包三个多G,没办法上 ...
- Jquery实现横向tab切换
//需求:鼠标放在不同的导航栏上,下面显示的内容自动切换 //代码如下 <!DOCTYPE html> <html lang="en"> <head& ...