1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Web;
  7. using System.Web.SessionState;
  8. using System.Web.UI;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.HtmlControls;
  11. namespace WebApplication1.验证码
  12. {
  13. ///  <summary>
  14. ///  完美随机验证码  0.10
  15. ///  Verion:0.10
  16. ///  Description:随机生成设定验证码,并随机旋转一定角度,字体颜色不同
  17. ///  </summary>
  18. public class ValidateCode : System.Web.UI.Page
  19. {
  20. private void Page_Load(object sender, System.EventArgs e)
  21. {
  22. string  randomcode  =  this.CreateRandomCode(4);
  23. Session["ValidateCode"]  =  randomcode;
  24. //ViewState["ValidateCode"]  =  randomcode;
  25. this.CreateImage(randomcode);
  26. }
  27. ///  <summary>
  28. ///  生成随机码
  29. ///  </summary>
  30. ///  <param  name="length">随机码个数</param>
  31. ///  <returns></returns>
  32. private  string  CreateRandomCode(int length)
  33. {
  34. int rand;
  35. char code;
  36. string randomcode = String.Empty;
  37. //生成一定长度的验证码
  38. System.Random random = new Random();
  39. for(int i=0;i<length;i++)
  40. {
  41. rand = random.Next();
  42. if(rand%3 == 0)
  43. {
  44. code = (char)('A' + (char)(rand%26));
  45. }
  46. else
  47. {
  48. code = (char)('0' + (char)(rand%10));
  49. }
  50. randomcode += code.ToString();
  51. }
  52. return  randomcode;
  53. }
  54. ///  <summary>
  55. ///  创建随机码图片
  56. ///  </summary>
  57. ///  <param  name="randomcode">随机码</param>
  58. private  void  CreateImage(string randomcode)
  59. {
  60. int randAngle = 45; //随机转动角度
  61. int mapwidth = (int)(randomcode.Length * 23);
  62. Bitmap map = new Bitmap(mapwidth,28);//创建图片背景
  63. Graphics graph = Graphics.FromImage(map);
  64. graph.Clear(Color.AliceBlue);//清除画面,填充背景
  65. graph.DrawRectangle(new Pen(Color.Black,0),0,0,map.Width-1,map.Height-1);//画一个边框
  66. //graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
  67. Random rand = new Random();
  68. //背景噪点生成
  69. Pen blackPen = new Pen(Color.LightGray,0);
  70. for (int i=0;i<50;i++)
  71. {
  72. int x = rand.Next(0,map.Width);
  73. int y = rand.Next(0,map.Height);
  74. graph.DrawRectangle(blackPen,x,y,1,1);
  75. }
  76. //验证码旋转,防止机器识别
  77. char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组
  78. //文字距中
  79. StringFormat format = new StringFormat(StringFormatFlags.NoClip);
  80. format.Alignment = StringAlignment.Center;
  81. format.LineAlignment = StringAlignment.Center;
  82. //定义颜色
  83. Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
  84. //定义字体
  85. string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
  86. for(int i=0;i<chars.Length;i++)
  87. {
  88. int cindex = rand.Next(7);
  89. int findex = rand.Next(5);
  90. Font f = new System.Drawing.Font(font[findex],13,System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)
  91. Brush b = new System.Drawing.SolidBrush(c[cindex]);
  92. Point dot = new Point(16,16);
  93. //graph.DrawString(dot.X.ToString(),fontstyle,new SolidBrush(Color.Black),10,150);//测试X坐标显示间距的
  94. float angle = rand.Next(-randAngle,randAngle);//转动的度数
  95. graph.TranslateTransform(dot.X,dot.Y);//移动光标到指定位置
  96. graph.RotateTransform(angle);
  97. graph.DrawString(chars[i].ToString(),f,b,1,1,format);
  98. //graph.DrawString(chars[i].ToString(),fontstyle,new SolidBrush(Color.Blue),1,1,format);
  99. graph.RotateTransform(-angle);//转回去
  100. graph.TranslateTransform(2,-dot.Y);//移动光标到指定位置
  101. }
  102. //graph.DrawString(randomcode,fontstyle,new SolidBrush(Color.Blue),2,2); //标准随机码
  103. //生成图片
  104. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  105. map.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
  106. Response.ClearContent();
  107. Response.ContentType = "image/gif";
  108. Response.BinaryWrite(ms.ToArray());
  109. graph.Dispose();
  110. map.Dispose();
  111. }
  112. #region Web 窗体设计器生成的代码
  113. override protected void OnInit(EventArgs e)
  114. {
  115. //
  116. // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
  117. //
  118. InitializeComponent();
  119. base.OnInit(e);
  120. }
  121. /// <summary>
  122. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  123. /// 此方法的内容。
  124. /// </summary>
  125. private void InitializeComponent()
  126. {
  127. this.Load += new System.EventHandler(this.Page_Load);
  128. }
  129. #endregion
  130. }
  131. }

C#写的较完美验证码通用类的更多相关文章

  1. 我写的一个ExcelHelper通用类,可用于读取或生成数据

    读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...

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

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

  3. Java 验证码工具类

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

  4. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  5. DataTable转换为List<Model>的通用类

    在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便. 所以很多人都是按照以下方式做的: // 获得查询结果DataTable dt = DbHelper ...

  6. Django子应用里的通用类混合视图处理

    # 子应用的views.py此文件用于编写Web应用视图,处理复杂的业务逻辑 #导入方法视图模板 from django.shortcuts import render #导包 from django ...

  7. Excel通用类工具(二)

    前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...

  8. C#:导入Excel通用类(Xls格式)

    PS:在CSV格式和XLSX格式中有写到通用调用的接口和引用的插件,所以在这个xls格式里面并没有那么详细,只是配上xls通用类. 一.引用插件NPOI.dll.NPOI.OOXML.dll.NPOI ...

  9. windows下简单验证码识别——完美验证码识别系统

    此文已由作者徐迪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 讲到验证码识别,大家第一个可能想到tesseract.诚然,对于OCR而言,tesseract确实很强大,自带 ...

随机推荐

  1. 神奇的版本库—————GIT

    表示是第一次接触这个东东,然后疯狂百度了一波资料,然而=-=,完全不敢相信居然百度出了,GIT是全球最大同性交友网站...... 简直有点毁三观呐..好吧,其实按道理来说,这么解释也没有错欸,官方说明 ...

  2. ch1-vuejs基础入门(hw v-bind v-if v-for v-on v-model 应用组件简介 小案例)

    1 hello world 引入vue.min.js 代码: ----2.0+版本 <div id="test"> {{str}} </div> <s ...

  3. Lucene介绍与入门使用

    Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整 ...

  4. Access-Control-Allow-Origin与Ajax跨域

    问题 在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在response中添加 Access-Control-Allow-Origin 的header,才能让前者成功 ...

  5. 【框架学习与探究之AOP--Castle DynamicProxy】

    声明 本文欢迎转载,原始地址:http://www.cnblogs.com/DjlNet/p/7603654.html 前言 先说一点废话,在此之前博主也在早期就接触了或者看了些许AOP相关的文章,然 ...

  6. 关于scanf 与 cin gets(),getline()......输入输出字符串的区别

    很对人对于字符串的输入输出一直是比较模糊的,今天总结一下几个常用的输入流符号对于输入字符串时的区别: 1.scanf(),首先 它遇到空格或回车键(\n)就会结束,并且会将回车符算入字符串中: 2.c ...

  7. FixedUpdate真的是固定的时间间隔执行吗?聊聊游戏定时器

    0x00 前言 有时候即便是官方的文档手册也会让人产生误解,比如本文将要讨论的Unity引擎中的FixedUpdate方法. This function is called every fixed f ...

  8. uva242,Stamps and Envelope Size

    这题紫薯上翻译错了 应该是:如果有多个并列,输出邮票种类最少的那个,如果还有并列,输出最大面值最小的那个 坑了我一个下午 dp[p][q]==1表示可以用不超过q张组成面额p 结合记忆化,p从1开始枚 ...

  9. javascript 之数据类型

    写在前面 国庆整理资料时,发现刚开始入门前端时学习JS 的资料,打算以一个基础入门博客记录下来,有不写不对的多多指教: 先推荐些书籍给需要的童鞋 <JavaScript 高级程序设计.pdf&g ...

  10. [poj1644]放苹果

    题目链接:http://poj.org/problem?id=1664       把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5, ...