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. 【SSH网上商城项目实战26】完成订单支付后的短信发送功能

     转自: https://blog.csdn.net/eson_15/article/details/51475431 上一节我们使用了Java mail完成了给买家发送邮件的功能,还遗留一个功能,就 ...

  2. poj 2796 Feel Good 单调队列

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8753   Accepted: 2367 Case Ti ...

  3. jenkins 分布式部署

    一 什么是Jenkins的分布式构建和部署 Jenkins的分布式构建,在Jenkins的配置中叫做节点,分布式构建能够让同一套代码或项目在不同的环境(如:Windows7\winxp和Linux系统 ...

  4. 从JSON中读取数据追加到HTML中

    本文来自https://www.jianshu.com/p/04127d74d88c,并非本人原创,只是作为自己学习使用的资料,如有浏览者请点击地址自行到原作者页面浏览 有时候我们需要将json数据直 ...

  5. 1739 GPA排序 个人博客:doubleq.win

    个人博客:doubleq.win 1739 GPA排序  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description ...

  6. SublimeText 批量清除空行

    sublimeText 编辑器批量清除空行: 1.CTRL+H 打开 replace 功能 2.选择 Regular expression 功能 3.批两替换  点击replace All

  7. Node服务端极速搭建 - nvmhome

    本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...

  8. python装饰器 高阶函数 函数闭包

    1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...

  9. Visual Studio Code 之 运行java代码

    1.安装扩展. 2.安装成功后,会在右键菜单中多出一个选项: 更改vscode“用户设置”文件:添加java.home(jdk目录)以及runcode显示在终端(解决中文乱码问题) code runn ...

  10. Python startswith()函数 与 endswith函数

    函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头一.函数说明语法:string.startswith(str, beg=0,end=len(string))       或 ...