zoukankan      html  css  js  c++  java
  • 验证码详解,高手飘过

    本来想偷懒,在网络找验证码类,可是没找到自己需要的;有点伤心,看了一下别人写的,然后开始花了一个多小时解决问题, 放在这里 给我和不懂的盆友们查看备用  主要就以代码解释为主了,楼主语文重来不及格, 看code

    View Code
      1 using System;
    2 using System.Drawing;
    3 using System.Drawing.Drawing2D;
    4 using System.Drawing.Imaging;
    5 using System.IO;
    6
    7 namespace Tools
    8 {
    9 public class CheakCode
    10 {
    11 #region 构造
    12
    13 /// <summary>
    14 /// 验证码类,随机生成4到5个字符
    15 /// <example>
    16 ///CheakCode cheakcode = new CheakCode();
    17 ///
    18 ///Response.ClearContent();
    19 ///
    20 ///Response.ContentType = "image/Gif";
    21 ///
    22 ///Response.BinaryWrite(cheakcode.GetImgWithValidateCode().ToArray());
    23 ///
    24 ///cheakcode = null;
    25 /// </example>
    26 /// </summary>
    27 public CheakCode() { }
    28
    29 public CheakCode(string codeStr, int h, int w, int codeNum, int fSize)
    30 {
    31 this.codeStr = codeStr;
    32 this.height = h;
    33 this.width = w;
    34 this.codeNum = codeNum;
    35 this.fontSize = fSize;
    36 }
    37
    38 public CheakCode(string codeStr)
    39 {
    40 this.codeStr = codeStr;
    41 }
    42
    43 public CheakCode(int fSize, string codeStr)
    44 {
    45 this.codeStr = codeStr;
    46 this.fontSize = fSize;
    47 }
    48
    49 public CheakCode(string codeStr, int codeNum)
    50 {
    51 this.codeNum = codeNum;
    52 this.codeStr = codeStr;
    53 }
    54
    55 public CheakCode(int w, int h)
    56 {
    57 this.height = h;
    58 this.width = w;
    59 }
    60
    61 #endregion 构造
    62
    63 #region 属性
    64
    65 private int _width = 100;
    66
    67 /// <summary>
    68 /// 验证码彩条宽度
    69 /// </summary>
    70 public int width { get { return this._width; } set { this._width = value; } }
    71
    72 private int _height = 40;
    73
    74 /// <summary>
    75 /// 验证码彩条高度
    76 /// </summary>
    77 public int height { get { return this._height; } set { this._height = value; } }
    78
    79 private int _codeNum = new Random().Next(4, 6);
    80
    81 /// <summary>
    82 /// 验证码彩条需要产生的个数
    83 /// </summary>
    84 public int codeNum { get { return this._codeNum; } set { this._codeNum = value; } }
    85
    86 private string _codeStr = Guid.NewGuid().ToString().Replace("-", "");// "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
    87
    88 /// <summary>
    89 /// 验证码字符串 默认就拿Guid 产生字符
    90 /// </summary>
    91 public string codeStr { get { return this._codeStr; } set { this._codeStr = value; } }
    92
    93 private int _fontSize = 15;
    94
    95 /// <summary>
    96 /// 验证码彩条字体大小
    97 /// </summary>
    98 public int fontSize { get { return this._fontSize; } set { this._fontSize = value; } }
    99
    100 /// <summary>
    101 /// 彩条字体,我这里定义了一些,使用中随机抽取一种
    102 /// </summary>
    103 private String[] fontFamily ={ "Arial", "Verdana", "Comic Sans MS", "Impact", "Haettenschweiler",
    104 "Lucida Sans Unicode", "Garamond", "Courier New", "Book Antiqua", "Arial Narrow" };
    105
    106 /// <summary>
    107 /// 产生验证码字符串
    108 /// </summary>
    109 public string GetValidateCode
    110 {
    111 get
    112 {
    113 Random rd = new Random(); //创建随机数对象
    114
    115 string tempStr = null;
    116 for (int i = 0; i < codeNum; i++)
    117 {
    118 tempStr = tempStr + this.codeStr[rd.Next(this._codeStr.Length - 1)];
    119 }
    120 return tempStr;
    121 }
    122 private set { }
    123 }
    124
    125 #endregion 属性
    126
    127 /// <summary>
    128 /// 随机字符串,随机颜色背景,和随机线条产生的Image
    129 /// 返回 MemoryStream
    130 /// </summary>
    131 /// <returns>MemoryStream</returns>
    132 public MemoryStream GetImgWithValidateCode()
    133 {
    134 //声明位图
    135 Bitmap bitMap = null;
    136
    137 ///画笔
    138 Graphics gph = null;
    139 using (MemoryStream memStream = new MemoryStream())
    140 {
    141 Random random = new Random();
    142 int fontWidth = (int)Math.Round(this.width / (this.codeNum + 2) / 1.0); //这里主要是适应字符的字符,让其能全部显示出来
    143 int fontHeight = (int)Math.Round(this.height / 1.0);
    144 this.fontSize = fontWidth <= fontHeight ? fontWidth : fontHeight; //取字体大小中间值
    145 using (bitMap = new Bitmap(this.width, this.height))
    146 {
    147 gph = Graphics.FromImage(bitMap);
    148 gph.Clear(GetControllableColor(200));
    149 PointF Cpoint1 = new PointF(5, 5);
    150 int x1 = 0, y1 = 0;
    151 ///通过循环控制每一个字符
    152 for (int i = 0; i < this.GetValidateCode.Length; i++)
    153 {
    154 //随机字符位置
    155 x1 = random.Next(10) + 15 * i;
    156 y1 = random.Next(bitMap.Height / 4);
    157 Cpoint1 = new PointF(x1, y1);
    158 SolidBrush solidBrush = new SolidBrush(Color.FromArgb(random.Next(100), random.Next(100), random.Next(100))); //调整颜色,使其文字能看见
    159 Font textFont = new Font(this.fontFamily[random.Next(this.fontFamily.Length - 1)], this.fontSize, FontStyle.Bold);
    160 gph.TranslateTransform(10, 0);
    161 Matrix transform = gph.Transform;
    162 if (i % 2 == 0) //这里我做了大小写处理 true 大写了
    163 {
    164 gph.DrawString(this.GetValidateCode.Substring(i, 1).ToUpper(), textFont, solidBrush, Cpoint1); //写字符
    165 }
    166 else
    167 {
    168 gph.DrawString(this.GetValidateCode.Substring(i, 1), textFont, solidBrush, Cpoint1); //写字符
    169 }
    170
    171 gph.ResetTransform(); //重置矩阵
    172 }
    173 gph.DrawRectangle(new Pen(Color.Black, 2), 0, 0, bitMap.Width - 1, bitMap.Height - 1);// //画图片的边框线
    174 try
    175 {
    176 bitMap.Save(memStream, ImageFormat.Gif);//保存内存流
    177 }
    178 catch (Exception ex)
    179 {
    180 throw ex;
    181 }
    182 finally
    183 {
    184 bitMap.Dispose();
    185 random = null;
    186 gph.Dispose();
    187 }
    188 return memStream;
    189 }
    190 }
    191 }
    192
    193 /// <summary>
    194 /// 产生随机颜色(R,G,B)
    195 /// </summary>
    196 /// <param name="colorBase"></param>
    197 /// <returns>背景色</returns>
    198 private Color GetControllableColor(int colorBase)
    199 {
    200 Color color = Color.Black;
    201 if (colorBase > 200)
    202 {
    203 return color;
    204 }
    205 Random random = new Random();
    206 color = Color.FromArgb(random.Next(56) + colorBase, random.Next(56) + colorBase, random.Next(56) + colorBase);
    207 random = null;
    208 return color;
    209 }
    210
    211 /// <summary>
    212 /// 判断验证码是否正确
    213 /// </summary>
    214 /// <param name="inputValCode">待判断的验证码</param>
    215 /// <returns>正确返回 true,错误返回 false</returns>
    216 public bool IsRight(string inputValCode)
    217 {
    218 if (this.GetValidateCode.ToUpper().Equals(inputValCode.ToUpper()))//无论输入大小写都转换为大些判断
    219 {
    220 return true;
    221 }
    222 else
    223 {
    224 return false;
    225 }
    226 }
    227 }
    228 }
  • 相关阅读:
    Intern Day5
    PTA1007
    Intern Day5
    Intern Day2
    Intern Day5
    Intern Day2
    Intern Day2
    Intern Day2
    Intern Day1
    柯南剧场版17绝海的侦探
  • 原文地址:https://www.cnblogs.com/SpeakHero/p/2435175.html
Copyright © 2011-2022 走看看