验证码帮助类【CaptchaHelper 】

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类了.

 1 /// <summary>
 2     /// 完美随机验证码
 3     /// 随机生成设定验证码,并随机旋转一定角度,字体颜色不同
 4     /// </summary>
 5     public static class CaptchaHelper
 6     {
 7         /// <summary>
 8         /// 生成随机码
 9         /// </summary>
10         /// <param name="length">随机码个数</param>
11         /// <returns></returns>
12         public static string CreateRandonCode(int length) 
13         {
14             return Guid.NewGuid().ToString("N").Substring(0, length);
15         }
16 
17         /// <summary>
18         /// 创建随机码图片
19         /// </summary>
20         /// <param name="vcode">验证码</param>
21         /// <param name="fontSize">字体大小</param>
22         /// <param name="background">背景颜色</param>
23         /// <param name="border">边框颜色</param>
24         /// <returns>GIF图片二进制流</returns>
25         public static byte[] DrawImage(string vcode, float fontSize = 14, Color background = default(Color), Color border = default(Color)) 
26         {
27             //随机旋转角度 基数
28             const int RandAngle = 45;
29 
30             var width = vcode.Length * (int)fontSize;
31 
32             //创建图片背景
33             using (var map = new Bitmap(width + 3, (int)fontSize + 10)) 
34             {
35                 using (var graphics = Graphics.FromImage(map)) 
36                 {
37                     graphics.Clear(background);//清除画面,填充背景
38                     graphics.DrawRectangle(new Pen(border, 0), 0, 0, map.Width-1, map.Height-1);//画一个边框
39 
40                     var random = new Random();
41 
42                     //背景噪点生成
43                     var blackPen = new Pen(Color.DarkGray, 0);
44 
45                     for (var i = 0; i < 50; i++) 
46                     {
47                         int x = random.Next(0, map.Width);
48                         int y = random.Next(0, map.Height);
49 
50                         graphics.DrawRectangle(blackPen, x, y, 1, 1);
51                     }
52 
53                     //验证码旋转,防止机器识别
54                     var chars = vcode.ToCharArray();//拆散字符串成单字符数组
55 
56                     //文字居中
57                     var format = new StringFormat(StringFormatFlags.NoClip)
58                     {
59                         Alignment = StringAlignment.Center,
60                         LineAlignment = StringAlignment.Center
61                     };
62 
63                     //定义颜色
64                     Color[] colors = { Color.Black, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple, Color.DarkGoldenrod };
65                     FontStyle[] styles = { FontStyle.Bold, FontStyle.Italic, FontStyle.Regular, FontStyle.Underline };
66 
67                     //定义字体
68                     string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
69                     foreach (char item in chars) 
70                     {
71                         int cindex = random.Next(8);
72                         int findex = random.Next(5);
73                         int sindex = random.Next(4);
74 
75                         var font = new Font(fonts[findex], fontSize, styles[sindex]);//字体样式(参数2为字体大小)
76                         Brush b = new SolidBrush(colors[cindex]);
77                         var dot = new Point(16, 16);
78 
79                         float angle = random.Next(-RandAngle, RandAngle);//转动的度数
80 
81                         graphics.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
82                         graphics.RotateTransform(angle);
83                         graphics.DrawString(item.ToString(CultureInfo.InvariantCulture), font, b, 1, 1, format);
84 
85                         graphics.RotateTransform(-angle);//转回去
86                         graphics.TranslateTransform(2, -dot.Y);//移动光标到指定位置
87 
88                     }
89                 }
90                 //生成图片
91                 var stream = new MemoryStream();
92                 map.Save(stream, ImageFormat.Gif);
93                 //输出图片流
94                 return stream.ToArray();
95             }
96         }
97     }

 

转载于:https://www.cnblogs.com/WarBlog/p/8484119.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于HTML5本地持久化存储的Web SQL、Local Storage、Cookies技术

在浏览器客户端记录一些信息&#xff0c;有三种常用的Web数据持久化存储的方式&#xff0c;分别是Web SQL、Local Storage、Cookies。Web SQL作为html5本地数据库&#xff0c;可通过一套API来操纵客户端的数据库&#xff08;关系数据库&#xff09;&#xff0c;下面是支持浏览器…

死锁

7.1 系统模型 定义&#xff1a;多个进程竞争一定数量的资源&#xff0c;某个进程申请资源&#xff0c;若此时该资源不可用&#xff0c;则进程进入等待状态。若所申请的资源被其他等待进程占用&#xff0c;则该等待进程可能再也不法改变其状态。 进程使用资源的顺序&#xff1a;…

Linux启动/停止/重启Mysql数据库

1、查看mysql版本   1&#xff09;status;   2&#xff09;select version(); 2、Mysql启动 1&#xff09;使用 service 启动&#xff1a;   service mysqld start (5.0版本是mysqld)   service mysql start (5.5.7版本是mysql) 2&#xff09;使用 mysqld 脚本启动&…

mysql lepus_MySQL 监控软件lepus天兔

概述类别版本操作系统Centos 7.4数据库版本MySQL 5.6.49天兔版本lepus 3.7依赖软件1.MySQL 5.0及以上(必须,用来存储监控系统采集的数据)2.Apache 2.2及以上 (必须,WEB服务器运行服务器)3.PHP 5.3以上 (必须,提供WEB界面支持)4.Python2 (必须,推荐2.6及以上版本,执行数据采集和…

HTML5中Web Worker技术的使用实例

web worker是html5中新特性中非常吸引人的技术亮点之一&#xff0c;我们可以把它理解为javascript中的多线程技术&#xff0c;我们知道javascript语言的执行环境是单线程的&#xff0c;浏览器执行某段程序的时候会阻塞直到运行结束后再恢复到正常状态&#xff0c;而HTML5的Web …

选择技术栈构建通用平台

Java社区中有很多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时&#xff0c;我不禁要想为什么我们不能同时使用它们呢&#xff1f; 实际上&#xff0c;我认为有效地使用它们会为构建基础架构创建一个伟大的技术堆栈&#xff…

模式的秘密--工厂模式

工厂模式概念&#xff1a; 实例化对象&#xff0c;用工厂方法代替new操作工厂模式包括工厂方法模式和抽象工厂模式抽象工厂模式是工厂方法模式的扩展工厂模式的意图&#xff1a; 定义一个接口创建对象&#xff0c;但是让子类决定哪些类需要被实例化。工厂方法把实例化的工作推迟…

mysql定时清空表数据_Mysql实现定时清空一张表的旧数据并保留几条数据

要达到如下目的&#xff1a;Mysql数据库会每隔一段时间(可以是2小时&#xff0c;也可以是一天&#xff0c;这个可以自定义)&#xff0c;定时对一张库中的表做一个判断&#xff0c;如果这张表的数据超过了20条(这个数据也是自定义的&#xff0c;也可以是200条)&#xff0c;就保留…

Python中生成器generator和迭代器Iterator的使用方法

一、生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间2. 生成器的创建方式 第一种只要把一个列表生成式的 [ ] 改成 ( )ret (n 1 for n in range(0,10)) # 返回值是生成了一个…

Java 8中使用Lambda表达式的策略模式

策略模式是“ 设计模式&#xff1a;可重用对象的元素”书中的模式之一 。 本书所述的策略模式的意图是&#xff1a; 定义一系列算法&#xff0c;封装每个算法&#xff0c;并使它们可互换。 策略使算法独立于使用该算法的客户端而变化。 在本文中&#xff0c;我想给出一个或两个…

Html5移动开发之Localstorage(本地存储)

HTML5本地存储Localstorage自从Html5中出现了本地存储的&#xff08;LocalStorage)的概念后&#xff0c;很多人都会想这个东西和我们传统web开发中的Cookie有什么特别之处&#xff0c;当然笔者也是其中之一&#xff0c;也难怪&#xff0c;以前用惯了cookie对于新出现的事物总是…

php mysql 正则_MySQL 正则表达式

MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配&#xff0c; MySQL中使用 REGEXP 操作符来进行正则表达式匹配。如果您了解PHP或Perl&#xff0c;那么操作起来就非常简单&#xff0c;因为MySQL的正…

Linux自动人机交互expect

exp_test.sh文件 #!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect {"(yes/no)" {send "yes\r";exp_continue;}"password:" {send "hadoop\r";exp_continue;}eof {exit 0;} } 执行&#xff1a;expect …

使用Spring Integration聚合异步结果

嗨&#xff0c;我遇到了一个问题&#xff0c;该问题使用Spring Integration具有非常好的解决方案。 很多时候&#xff0c;我们需要一种将消息分发到未知数量的目的地的方案。 为此&#xff0c;我们使用主题方法。 但是有时&#xff0c;我们还希望从收到消息的所有目的地接收答案…

Html5开发之链接标签nav的用法

HTML(<nav>)元素用来表示一个含有多个超链接的区域&#xff0c;这个区域的连接可以连接到其他页面&#xff0c;也可以连接到本页面内部其他部分。用法说明:并不是所有的链接都必须使用<nav>元素,它只用来将一些热门的链接放入导航栏,例如<footer>元素就常用来…

java response 获得code_Java教程分享使用HttpClient抓取页面内容

Java教程分享使用HttpClient抓取页面内容&#xff0c;使用HttpClient工具来发送Http请求1.简介HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和…

关于Function原型对象和Object原型对象的一些疑惑

网上有一道美团外卖的面试题是这样的&#xff1a;Function.prototype.a a; Object.prototype.b b; function Person(){}; var p new Person(); console.log(p.a: p.a); // p.a: undefined console.log(p.b: p.b); // p.b: b问为什么&#xff1f;有不少同学第一眼看上去就觉…

HTML5 实现离线数据缓存

1.配置缓存文件 cache manifestMIME TYPE&#xff1a;text/cache-manifest文件名称&#xff1a;name.appcache作用&#xff1a;用于配置需要缓存的文件2.使用方法在服务器上添加MIME TYPE在apache virtual host 中添加[plain] view plaincopyAddType text/cache-manifest .appc…

pytest.7.常见套路

From: http://www.testclass.net/pytest/common_useage/ 在使用pytest的时候&#xff0c;下面这些问题我们可能会经常遇到&#xff0c;这里给出官方的解决方案&#xff0c;按照套路来执行就可以了。 基础用法 把命令行参数传入到用例动态添加命令行参数根据命令行参数来忽略用例…

linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9

MySQL 5.6.23升级到MySQL 5.7.9MySQL 5.7.9新特性一、安全性1.1. 用户表 mysql.user 的 plugin字段不允许为空&#xff0c; 默认值是 mysql_native_password&#xff0c;而不是 mysql_old_password&#xff0c;不再支持旧密码格式;1.2. 增加密码过期机制&#xff0c;过期后需要…