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+在绘制验证码中的使用的更多相关文章

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

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

  2. 通过GDI+绘制 验证码

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

  3. C#验证码 使用GDI绘制验证码

    首先展示一下效果图如下: C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能.具体实现过程如下: 首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要 ...

  4. C#中的GDI+图形绘制方法

    GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化 ...

  5. 笔记11:GDI 制作数字验证码

    大二学长让我学下GDI绘制验证码,然后自己就试了试了.找了点视频看了下. 现在会画直线,矩形,字符串,制作验证码 一.绘制一条直线 private void button1_Click(object ...

  6. 如何用GDI+画个验证码

    如何使用GDI+来制作一个随机的验证码 绘制验证码之前先要引用 using System.Drawing; using System.Drawing.Drawing2D; 首先,先写一个方法来取得验证 ...

  7. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  8. WPF GDI+字符串绘制成图片(二)

    原文:WPF GDI+字符串绘制成图片(二) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...

  9. WPF GDI+字符串绘制成图片(一)

    原文:WPF GDI+字符串绘制成图片(一) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...

随机推荐

  1. 关系型数据的分布式处理系统MyCAT(转载)

      ——概述和基本使用教程 日期:2014/12/24 文:阿蜜果 1.   MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建 ...

  2. 基于webmagic的种子网站爬取

    代码地址如下:http://www.demodashi.com/demo/12175.html 1. 概述 因为无聊,闲来没事做,故突发奇想,爬个种子,顺便学习爬虫.本文将介绍使用Spring/Myb ...

  3. java统计中英文字数 Java问题通用解决代码

    http://yangchao20020.blog.163.com/blog/static/483822472011111635424751/   这个不适用于新浪微博字数的统计,结果有差别,若需要可 ...

  4. SQLServer中存储过程StoredProcedure创建及C#调用(转)

    此文作为入门了解用,转自http://www.2cto.com/database/201502/378260.html 存储过程就是已经编译好的.优化过的放在数据库服务器中的一些SQL语句:可供应用程 ...

  5. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  6. java之JDK动态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 JDK动态代理: JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类 优势: - 1. 业务类只需要关注业务逻辑本身 ...

  7. HTML5 2D平台游戏开发#6地图绘制

    此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-base ...

  8. Apache配置压缩优化时报错——undefined symbol: inflateEnd

    Apache配置压缩优化时报错——undefined symbol: inflateEnd 环境:CentOS 6.4 软件版本:httpd-2.4.6 apr-1.4.8 apr-util-1.5. ...

  9. docker-maven-plugin

    顾名思义,docker-maven-plugin是一个docker的maven插件,用来执行docker镜像的制作和上传,他的地址是https://github.com/spotify/docker- ...

  10. 【文献阅读】Densely Connected Convolutional Networks-best paper-CVPR-2017

    Densely Connected Convolutional Networks,CVPR-2017-best paper之一(共两篇,另外一篇是apple关于GAN的paper),早在去年八月 De ...