GDI+在绘制验证码中的使用
GDI+最简单的理解就是用来绘图的。其中包括点、直线、矩形、字符串等等。
先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace GDIDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
//一根笔 一张纸 两点 绘制直线的对象
} private void button1_Click(object sender, EventArgs e)
{
//创建一个GDI对象
Graphics g = this.CreateGraphics();//new Graphics(); //创建一支画笔对象
Pen pen = new Pen(Brushes.Yellow); //创建两个点
Point p1 = new Point(, );
Point p2 = new Point(, ); g.DrawLine(pen, p1, p2);
} /// <summary>
/// 重新绘制窗体的时候,直线也重新画一遍
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Paint(object sender, PaintEventArgs e)
{
//创建一个GDI对象
Graphics g = this.CreateGraphics();//new Graphics(); //创建一支画笔对象
Pen pen = new Pen(Brushes.Yellow); //创建两个点
Point p1 = new Point(, );
Point p2 = new Point(, ); g.DrawLine(pen, p1, p2);
} private void button2_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Brushes.Yellow);
Size size=new System.Drawing.Size(,);
Rectangle rec = new Rectangle(new Point(,),size);
g.DrawRectangle(pen, rec);
}
}
}
GDI绘制直线
那么有了基本的了解就可以用类似的方法来绘制验证码了。主要包括绘制字符串、直线、点三部分,在BitMap位图上面绘制,然后将整个图片镶嵌到PictureBox中,单击该控件爱你,验证码发生变化。具体代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace 点击生成验证码
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} /// <summary>
/// 点击更换验证码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_Click(object sender, EventArgs e)
{
Random r = new Random();
string str = null;
for (int i = ; i < ; i++)
{
int rNumber = r.Next(, ); //产生5个验证码随机数
str += rNumber.ToString(); } Bitmap bmp = new Bitmap(, );
//创建一个GDI对象
Graphics g = Graphics.FromImage(bmp); //可以理解为将位图作为画布 //绘制验证码上面的数字
for (int i = ; i < ; i++)
{
Point p=new Point(i*,); //此处的相对位置,不是相对窗体的,而是相对于pictureBox控件的
string[] font = {"微软雅黑","宋体","黑体","隶书","仿宋" };
Color[] colors = { Color.Yellow, Color.Blue, Color.Black, Color.Red, Color.Green }; g.DrawString(str[i].ToString(), new Font(font[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 p3 = new Point(r.Next(, bmp.Width), r.Next(, bmp.Height));
bmp.SetPixel(p3.X,p3.Y,Color.Yellow);
}
//将画好的位图赋值给Image属性,即将画好的图片镶嵌到pictureBox中
pictureBox1.Image = bmp;
}
}
}
绘制数字验证码
实现效果图:

GDI+在绘制验证码中的使用的更多相关文章
- 利用GDI+在Winfrom绘制验证码
string yzm: private void yangzhengma() { Bitmap bt = new Bitmap(70,22);//创建位图对象 Graphics gs = Graphi ...
- 通过GDI+绘制 验证码
只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...
- C#验证码 使用GDI绘制验证码
首先展示一下效果图如下: C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能.具体实现过程如下: 首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要 ...
- C#中的GDI+图形绘制方法
GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化 ...
- 笔记11:GDI 制作数字验证码
大二学长让我学下GDI绘制验证码,然后自己就试了试了.找了点视频看了下. 现在会画直线,矩形,字符串,制作验证码 一.绘制一条直线 private void button1_Click(object ...
- 如何用GDI+画个验证码
如何使用GDI+来制作一个随机的验证码 绘制验证码之前先要引用 using System.Drawing; using System.Drawing.Drawing2D; 首先,先写一个方法来取得验证 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- WPF GDI+字符串绘制成图片(二)
原文:WPF GDI+字符串绘制成图片(二) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...
- WPF GDI+字符串绘制成图片(一)
原文:WPF GDI+字符串绘制成图片(一) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...
随机推荐
- 用SwiftGen管理UIImage等的String-based接口
代码地址如下:http://www.demodashi.com/demo/12149.html 问题现状 平时我们使用UIImage,UIFont,UIColor会遇到很多String-based的接 ...
- .Net、C# 汉字转拼音,简体繁体转换方法
Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持.使用该类库提供的类,.NET 开发人员可以更方便的创建支 ...
- windows小游戏之扫雷技巧
通过单击即可挖开方块.如果挖开的是地雷,则您输掉游戏. 如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷.
- nginx适配移动端
考虑到网站的在多种设备下的兼容性,有很多网站会有手机版和电脑版两个版本.访问同一个网站URL,当服务端识别出用户使用电脑访问,就打开电脑版的页面,用户如果使用手机访问,则会得到手机版的页面. ngin ...
- debian SSD ext4 4K 对齐
新入手了一台thinkpad, 原来的机械硬盘是500G的, 于是购入一块镁光的MX200 250G的SSD来新装debian stable(jessie) 1, 安装系统的之前按住F1进入bios后 ...
- MFC错误集锦
MFC中相关报错及其解决的方法: (1)0x00000005: 解决的方法:看是哪里的 数组越界: (2)0xCCCCCCCC:在类中声明指针,但没有赋初值之类的错误. 解决的方法:在类的构造函数中给 ...
- 运用Arc Hydro提取河网
Arc hydro 插件需要 spatial analyst 支持: 解决方法:Tools菜单>>Extensions...,勾选Spatial Analyst 1.设置存储路径 ApUt ...
- pip或者anacnda安装opencv以及opencv-contrib
一条命令就可以搞定: pip install opencv-contrib-python opencv-python 或者: pip install opencv-contrib-python== ...
- HDFS源码分析数据块校验之DataBlockScanner
DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独 ...
- 【Python + Selenium】之unittest测试用例满足条件,进行跳过测试Skip
直接上代码: __author__ = 'zc' import unittest class demoSkipTest(unittest.TestCase): a = 70 b = 50 print( ...