zoukankan      html  css  js  c++  java
  • 验证码帮助类【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     }
  • 相关阅读:
    大道至简读后感
    机器学习十讲(一)
    第一个TensorFlow的简单例子
    初识深度学习
    如何使用本地的Navicat连接服务器中的Mysql
    阿里云ECS-安装Tomcat
    阿里云ECS-CentOS 8上安装MySQL 8.0
    阿里云ECS--CentOS8安装jdk1.8
    进度报告十(重大技术需求)
    进度报告九 (重大技术需求调研)
  • 原文地址:https://www.cnblogs.com/WarBlog/p/8484119.html
Copyright © 2011-2022 走看看