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. Java 双亲委派模型

    1. Java 类加载器的分类 2. 双亲委派模型 Parents Delegration Model

  2. JSP简单实现统计网页访问次数

    JSP简单实现统计网页访问次数 需求:统计网页的访问次数 核心思想:利用application对象,将访问次数的信息放入application对象中,每次访问就+1.这里利用了application对 ...

  3. [SCOI2009]粉刷匠

    线性DP预处理+分组背包 首先设dp[i][j][0/1]表示该木板前i个格刷了j次且最后一次颜色为0/1的最大正确数 做下0/1的前缀和然后转移状态 dp[i][j][k]=max(dp[l][j] ...

  4. bootstrap框架怎么在html页面加载使用

    今天敲代码的时候,正好碰到这个问题. 与大家分享这个解决方法:     1/7 到bootstrap官方网站下载,对于我们开发者来说,直接下载编译和压缩后的CSS.JavaScript文件,另外还包含 ...

  5. xshell连接虚拟机Connection failed

    一.问题描述:xshell连接不了虚拟机,出现错误提示:Could not connect to '192.168.1.100' (port 22): Connection failed. 二.查找错 ...

  6. Week1——JavaEE

    本科目标 首先,对我来说自己想走的方向是JavaWeb后台开发,因此JavaEE对我来说也是比较重要的,想学好这门课.进一步巩固自己现有的基础知识,完善自己的项目经验,更加熟悉开发流程.在框架方面我还 ...

  7. Software Testing Techniques LAB 01: test Junit and Eclemma

    1. Installing  1. Install Junit and hamcrest First, I download the Junit-4.12.jar and hamcrest-core- ...

  8. Windows10禁用update

    1.运行 gpedit.msc 或搜索 组策略 ,点 计算机配置—管理模板—Windows组件—Windows更新—配置自动更新 ,设置“已禁用”.2.点 控制面板—系统和安全—管理工具 ,点 服务 ...

  9. Python 发送邮件案例

    文件形式的邮件 #!/usr/bin/env python #coding: utf-8 import smtplib from email.mime.text import MIMEText fro ...

  10. django项目配置

    创建工程 本项目使用git管理项目代码,代码库放在gitee码云平台.(注意,公司中通常放在gitlab私有服务器中) 1. 在git平台创建工程 1) 创建私有项目库 2)克隆项目到本地 3)创建并 ...