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. bnu 10783 格斗游戏 线段与圆的关系

    格斗游戏 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class name: ...

  2. POJ 1258(最小生成树+知识)

    用kruskal算法,利用w[i]给r[i]间接排序,从而r[i]可以按照边大小保存序号,同时要判断是否在一个集合里面 #include <cstdio> #include <ios ...

  3. HTTP 错误500.19 - 错误代码 0x80070021

    1.错误描述 HTTP 错误500.19 -Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core  通知 Begi ...

  4. C#学习笔记-继承基本知识

    namespace Inheritance { class Program { static void Main(string[] args) { Dog dog = new Dog(); dog.A ...

  5. Python Django ORM创建基本类以及生成数据结构

    #在项目目录下的modules.py中创建一个类,来自动生成一张表UserInfo class UserInfo(models.Model): username = models.CharField( ...

  6. 第一天-python基础

    每一个今天的坚持都会改变明天的自己! 一.python介绍 python是一门由解释型.弱类型的高级开发编程语言,由龟叔于1989圣诞开发出,后经过二十多年的发展,因其简洁高效的特点而被广泛使用,在世 ...

  7. MongoDB 排序文档

    sort() 方法 要在 MongoDB 中的文档进行排序,需要使用sort()方法. sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序. 要指定排序顺序1和-1. 1用于升序排列 ...

  8. Function Object in C++

    Function object is very userful to use member function or non-member function as callback mechanism, ...

  9. Install Java JDK JRE on Ubuntu/Debian with Apt-Get

    Introduction As a lot of articles and programs require to have Java installed, this article will gui ...

  10. 使用ZXing实现扫描多个条形码页面

    1.前言 ZXing是google官方推出的跨平台的基于Java实现处理扫面二维码或者条形码的库.支持很多格式,一维条码支持UPC-A,UPC-E,EAN-8,Code 39,Code 93等格式,二 ...