zoukankan      html  css  js  c++  java
  • 验证码生成

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 using System.Drawing;
      7 using System.Drawing.Drawing2D;
      8 using System.IO;
      9 using System.Drawing.Imaging;
     10 
     11 namespace Common
     12 {
     13     public class ValidateCode
     14     {
     15         //验证码长度
     16         private int codeLength;
     17 
     18         //初始化验证码长度
     19         public ValidateCode(int codeLength)
     20         {
     21             this.codeLength = codeLength;
     22         }
     23 
     24         //生成验证码字符串 数字+字符串
     25         public string CreateValidateCode()
     26         {
     27             int[] randCode = new int[codeLength];
     28             int[] randNum = new int[codeLength];
     29             string validateStr = "";
     30 
     31             //获取  得到随机数的随机率有关的数字
     32             int seek = (int)DateTime.Now.Ticks;//可能会有问题,因为DateTime.Now.Ticks可能超过int类型
     33 
     34             Random rand = new Random(seek);
     35             //获取一个随机数作为随机数的开始
     36             int beginRand = rand.Next(0, int.MaxValue - codeLength * 10000);
     37             int[] seeks = new int[codeLength];
     38             for (int i = 0; i < codeLength; i++)
     39             {
     40                 beginRand += 10000;
     41                 seeks[i] = beginRand;
     42             }
     43             //给每个生成的随机数给不同的随机率
     44             for (int j = 0; j < codeLength; j++)
     45             {
     46                 Random r = new Random(seeks[j]);
     47                 int powNum = (int)Math.Pow(10, codeLength);
     48                 randNum[j] = r.Next(powNum, int.MaxValue);
     49             }
     50             //randNum 保存了四个随机数
     51             for (int k = 0; k < codeLength; k++)
     52             {
     53                 string numStr = randNum[k].ToString();
     54                 int numLen = numStr.Length;
     55                 Random r = new Random();
     56                 int numPostion = r.Next(0, numLen - 1);
     57                 randCode[k] = int.Parse(numStr.Substring(numPostion, 1));
     58             }
     59             for (int i = 0; i < codeLength; i++)
     60             {
     61                 validateStr += randCode[i].ToString();
     62             }
     63             return validateStr;
     64         }
     65 
     66 
     67         public byte[] CreateVCodeImg(string validateCode)
     68         {
     69             //初始化一张图像,点位图 图像的大小:长Math.Ceiling(validateCode.Length * 12.0) 宽:24 px
     70                 Bitmap bitmap = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 24);
     71                 //准备一张画笔  专门为某个图像准备的画笔
     72                 Graphics g = Graphics.FromImage(bitmap);//Graphics和Bitmap继承了IDisposable接口 所以最好使用后释放
     73                 try
     74                 {
     75 
     76 
     77                     Random random = new Random();
     78 
     79                     //用画笔把图像的背景色清空(填充成白色的图像背景)
     80                     g.Clear(Color.White);
     81 
     82                     //画干扰线 循环25次 每次4个数 生成两个点 25条(有可能线被覆盖)
     83                     //每次循环生成一条线
     84                     for (int i = 0; i < 25; i++)
     85                     {
     86                         int linex1 = random.Next(bitmap.Width);
     87                         int linex2 = random.Next(bitmap.Width);
     88                         int liney1 = random.Next(bitmap.Height);
     89                         int liney2 = random.Next(bitmap.Height);
     90                         g.DrawLine(new Pen(Color.Silver), linex1, liney1, linex2, liney2);
     91                     }
     92                     //准备
     93                     Font f = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
     94                     LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, bitmap.Width, bitmap.Height), Color.Blue, Color.DarkRed, 1.2f, true);
     95                     //把验证码字符串用画笔画到bitmap上
     96                     g.DrawString(validateCode, f, brush, 3, 2);
     97                     //生成像素点 验证码图片中的干扰点 会覆盖在文字 画的先后顺序
     98                     for (int j = 0; j < 100; j++)
     99                     {
    100                         int x = random.Next(bitmap.Width);
    101                         int y = random.Next(bitmap.Height);
    102                         bitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
    103                     }
    104                     //画图片的边框线 边框线在图片的里面 所以边框线不能和bitmap同样大小
    105                     g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1);
    106                     //保存图片 把图片输出要把图片转化成流输出 内存流
    107                     MemoryStream ms = new MemoryStream();
    108                     bitmap.Save(ms, ImageFormat.Jpeg);
    109                     //输出图片流
    110                     return ms.ToArray();
    111                 }
    112                 finally
    113                 {
    114                     g.Dispose();
    115                     bitmap.Dispose();
    116                 }
    117         }
    118     }
    119 }
  • 相关阅读:
    重新开始学习javase_对象的摧毁
    昨天一日和彭讨论post请求数据的问题
    昨天在公司加班,上午好像就是弄一个ftp的linux服务问题
    昨天有是发现一个新的技术问题
    昨天下午快要下班的时候让他们东软测试
    昨天也没有和家里通话,把时间给了一位同事
    早上8:45到达
    又是一个月初
    今天是下雨天
    从每天开始在工作上才算有点事情
  • 原文地址:https://www.cnblogs.com/lvshijian-1994/p/5201296.html
Copyright © 2011-2022 走看看