GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,

图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.

大概了解了什么是GDI+后,我们来看一下绘图要用到的主要工具,要画图,

1.要画纸(Map),

2.画画板可以通过Graphics这个类来创建,有了画板,

3.总得弄个笔(Pen)什么之类的吧,不然怎么画呀,难不成我们用手指画.笔又可以分好多种类,比如铅笔,画刷等.它们的区别主要是铅笔可以用来画线条,而画刷呢,嘿嘿,自己考虑下.在c#中我们可以用Pen,Brush类来实现类似功能.

4.颜料则自然是用Color类了.

 /// <summary>
/// 完美随机验证码
/// 随机生成设定验证码,并随机旋转一定角度,字体颜色不同
/// </summary>
public static class CaptchaHelper
{
/// <summary>
/// 生成随机码
/// </summary>
/// <param name="length">随机码个数</param>
/// <returns></returns>
public static string CreateRandonCode(int length)
{
return Guid.NewGuid().ToString("N").Substring(, length);
} /// <summary>
/// 创建随机码图片
/// </summary>
/// <param name="vcode">验证码</param>
/// <param name="fontSize">字体大小</param>
/// <param name="background">背景颜色</param>
/// <param name="border">边框颜色</param>
/// <returns>GIF图片二进制流</returns>
public static byte[] DrawImage(string vcode, float fontSize = , Color background = default(Color), Color border = default(Color))
{
//随机旋转角度 基数
const int RandAngle = ; var width = vcode.Length * (int)fontSize; //创建图片背景
using (var map = new Bitmap(width + , (int)fontSize + ))
{
using (var graphics = Graphics.FromImage(map))
{
graphics.Clear(background);//清除画面,填充背景
graphics.DrawRectangle(new Pen(border, ), , , map.Width-, map.Height-);//画一个边框 var random = new Random(); //背景噪点生成
var blackPen = new Pen(Color.DarkGray, ); for (var i = ; i < ; i++)
{
int x = random.Next(, map.Width);
int y = random.Next(, map.Height); graphics.DrawRectangle(blackPen, x, y, , );
} //验证码旋转,防止机器识别
var chars = vcode.ToCharArray();//拆散字符串成单字符数组 //文字居中
var format = new StringFormat(StringFormatFlags.NoClip)
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
}; //定义颜色
Color[] colors = { Color.Black, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple, Color.DarkGoldenrod };
FontStyle[] styles = { FontStyle.Bold, FontStyle.Italic, FontStyle.Regular, FontStyle.Underline }; //定义字体
string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
foreach (char item in chars)
{
int cindex = random.Next();
int findex = random.Next();
int sindex = random.Next(); var font = new Font(fonts[findex], fontSize, styles[sindex]);//字体样式(参数2为字体大小)
Brush b = new SolidBrush(colors[cindex]);
var dot = new Point(, ); float angle = random.Next(-RandAngle, RandAngle);//转动的度数 graphics.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
graphics.RotateTransform(angle);
graphics.DrawString(item.ToString(CultureInfo.InvariantCulture), font, b, , , format); graphics.RotateTransform(-angle);//转回去
graphics.TranslateTransform(, -dot.Y);//移动光标到指定位置 }
}
//生成图片
var stream = new MemoryStream();
map.Save(stream, ImageFormat.Gif);
//输出图片流
return stream.ToArray();
}
}
}

验证码帮助类【CaptchaHelper 】的更多相关文章

  1. Java 验证码工具类

    package com.wuyu.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ...

  2. php实现的IMEI限制的短信验证码发送类

    php实现的IMEI限制的短信验证码发送类 <?php class Api_Sms{ const EXPIRE_SEC = 1800; // 过期时间间隔 const RESEND_SEC = ...

  3. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  4. 【转载】Asp.Net生成图片验证码工具类

    在Asp.Net应用程序中,很多时候登陆页面以及其他安全重要操作的页面需要输入验证码,本文提供一个生成验证码图片的工具类,该工具类通过随机数生成验证码文本后,再通过C#中的图片处理类位图类,字体类,一 ...

  5. 一个不错的php验证码的类

    类的代码: <?php class Captcha { private $width; private $height; private $codeNum; private $code; pri ...

  6. Laravel 下生成验证码的类

    <?php namespace App\Tool\Validate; //验证码类 class ValidateCode { private $charset = 'abcdefghkmnprs ...

  7. 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案)

    主要功能:变灰,去噪,等提高清晰度等 代码类博客,无需多说,如下: public class UnCodebase { public Bitmap bmpobj; public UnCodebase( ...

  8. PHP 验证码生成类(可定制长度和内容)

    ===================VerifyTool====================== <?php class VerifyTool { private $fontPath; / ...

  9. php生成随机字符串和验证码的类

    网上有很多的php随机数与验证码的代码与文章,真正适用的没有几个. 索性自己搞一个吧. 开始本节的php教程 吧,以下代码的实现,主要做到可以很好区分一个get_code(),另一个create_ch ...

随机推荐

  1. csu 1356 Catch bfs(vector)

    1356: Catch Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 96  Solved: 40[Submit][Status][Web Board] ...

  2. 分ip统计网站访问次数

    package web.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; ...

  3. Cookie介绍

    1.Http协议与Cookie Cookie(小量信息)是HTTP协议指定的!先由服务器保存Cookie到浏览器,而下次浏览器请求服务器时把上一次请求得到Cookie再归还给服务器 由服务器创建保存到 ...

  4. java 包装类和基础数据

    package com.tercher.demo; public class LangClass { public static void main(String[] args) { //所有的包装类 ...

  5. hihernate一对多关联映射

    hihernate一对多关联映射 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端 ...

  6. jQuery轮播图(二)利用构造函数和原型创建对象以实现继承

    本文是在我开始学习JavaScript继承时,对原型继承的一些理解和运用.文中所述的继承方式均是使用js特有的原型链方式,实际上有了ES6的类之后,实现继承的就变得十分简单了,所以这种写法现在也不在推 ...

  7. OllyDbg的基本使用

    注:内容整理自<逆向工程核心原理>,结合我的OllyDbg版本修改了一些内容 1. OllyDbg常用命令及其快捷键 指令 快捷键 含义 Restart Ctrl+F2 重新开始调试 St ...

  8. 仿拉手团购App8-- 更多模块

    1.获得缓存大小和清除缓存 应用内数据的所有路径: /data/data/com.xxx.xxx/cache - 应用内缓存(注:对应方法getCacheDir()) /data/data/com.x ...

  9. c# 设计模式 之:抽象工厂

    1.作用:抽象工厂的目的就是生产[产品族],之前讲的“工厂模式”的每一个factory只造一种产品,抽象工厂让一个factory造多个产品. uml类图: 代码实现: 抽象工厂代码: namespac ...

  10. 《Java并发编程实战》文摘

    更新时间:2017-06-03 <Java并发编程实战>文摘,有兴趣的朋友可以买本纸质书仔细研究下. 一 线程安全性 1.1 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何 ...