• 一个.NET写的类似于google的验证码


    在开发B/S结构的应用程序时,登录时为了防止恶意操作,经常要用到验证码,类似的验证码在网上搜一下有很多,无非就是生成一个带有文字的图片,在这里,发布一个类似于google所用的验证码,给大家多一种选择。

    效果如图:

    代码如下:

    using System;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;

    namespace Mirainsoft.ValidateCode
    {
    /// <summary>
    /// 验证码处理类
    /// </summary>
    public class ValidateCodeFactory
        {
    /// <summary>
    /// 字体选择范围数组
    /// </summary>
    private string[] fonts = { "Times New Roman", "Georgia", "Arial", "Comic Sans MS" };
    /// <summary>
    /// 验证码取值范围数组
    /// </summary>
    private string[] CodeScopes = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
    ///// <summary>
    ///// 颜色取值范围数组
    ///// </summary>
    //private Color[] ColorScopes = { Color.Crimson, Color.PaleVioletRed, Color.MediumVioletRed, Color.Purple, Color.DarkViolet, Color.Indigo, Color.SlateBlue, Color.DarkSlateBlue, Color.MediumBlue, Color.DarkBlue, Color.SlateBlue, Color.DarkCyan, Color.Gold, Color.Goldenrod, Color.Orange, Color.OrangeRed, Color.Red, Color.DarkRed};
    /// <summary>
    /// 随机数
    /// </summary>
    private Random rand;
    /// <summary>
    /// 随机数种子
    /// </summary>
    private int randseed;
    private string text;
    private int width;
    private int height;
    private string familyName;
    private Bitmap image;

    /// <summary>
    /// 显示文本
    /// </summary>
    public string Text
            {
                get { return this.text; }
            }
    /// <summary>
    /// 生成的位图对像
    /// </summary>
    public Bitmap Image
            {
                get { return this.image; }
            }
    /// <summary>
    /// 验证码宽度
    /// </summary>
    public int Width
            {
                get { return this.width; }
            }
    /// <summary>
    /// 验证码高度
    /// </summary>
    public int Height
            {
                get { return this.height; }
            }

    /// <summary>
    /// 验证码处理类
    /// </summary>
    /// <param name="length">显示文本长度,随机生成</param>
    /// <param name="width">验证码宽度</param>
    /// <param name="height">验证码高度</param>
    public ValidateCodeFactory(int length, int width, int height)
            {
    this.randseed = 111;
    for (int i=0;i<length;i++)
    this.text = string.Concat(this.text, CodeScopes[Next(CodeScopes.Length)]);
    this.SetDimensions(width, height);
    this.SetFamilyName(this.fonts[Next(this.fonts.Length)]);
    this.GenerateImage();
            }

    /// <summary>
    /// 验证码处理类
    /// </summary>
    /// <param name="s">显示文本</param>
    /// <param name="width">验证码宽度</param>
    /// <param name="height">验证码高度</param>
    public ValidateCodeFactory(string s, int width, int height)
      {
    this.randseed = 111;
    this.text = s;
    this.SetDimensions(width, height);
    this.SetFamilyName(this.fonts[Next(this.fonts.Length)]);
    this.GenerateImage();
      }

    /// <summary>
    /// 验证码处理类
    /// </summary>
    /// <param name="s">显示文本</param>
    /// <param name="width">验证码宽度</param>
    /// <param name="height">验证码高度</param>
    /// <param name="familyName">字体名称</param>
    public ValidateCodeFactory(string s, int width, int height, string familyName)
      {
    this.randseed = 111;
    this.text = s;
    this.SetDimensions(width, height);
    this.SetFamilyName(familyName);
    this.GenerateImage();
      }

    /// <summary>
    /// 垃圾回收
    /// </summary>
            ~ValidateCodeFactory()
      {
       Dispose(false);
      }

    /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose()
      {
       GC.SuppressFinalize(this);
    this.Dispose(true);
      }

    /// <summary>
    /// 释放资源
    /// </summary>
    /// <param name="disposing">是否回收</param>
    protected virtual void Dispose(bool disposing)
      {
    if (disposing)
    // Dispose of the bitmap.
    this.image.Dispose();
      }

    /// <summary>
    /// 设置验证码的宽度和高度
    /// </summary>
    /// <param name="width">验证码宽度</param>
    /// <param name="height">验证码高度</param>
    private void SetDimensions(int width, int height)
            {
    // Check the width and height.
    if (width <= 0)
    throw new ArgumentOutOfRangeException("width", width, "Argument out of range, must be greater than zero.");
    if (height <= 0)
    throw new ArgumentOutOfRangeException("height", height, "Argument out of range, must be greater than zero.");
    this.width = width;
    this.height = height;
            }

    /// <summary>
    /// 设置显示文本的字体
    /// </summary>
    /// <param name="familyName">字体名称</param>
    private void SetFamilyName(string familyName)
            {
    try
                {
                    Font font = new Font(this.familyName, 12F);
    this.familyName = familyName;
                    font.Dispose();
                }
    catch
                {
    this.familyName = System.Drawing.FontFamily.GenericSerif.Name;
                }
            }

    /// <summary>
    /// 生成验证码
    /// </summary>
    private void GenerateImage()
            {
    // Create a new 32-bit bitmap image.
                Bitmap bitmap = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);

    // Create a graphics object for drawing.
                Graphics g = Graphics.FromImage(bitmap);
                g.SmoothingMode = SmoothingMode.AntiAlias;
                Rectangle rect = new Rectangle(0, 0, this.width, this.height);

    // Fill in the background.
                HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White);
                g.FillRectangle(hatchBrush, rect);

    // Set up the text font.
                SizeF size;
    float fontSize = rect.Height + 1;
                Font font;
    // Adjust the font size until the text fits within the image.
    do
                {
                    fontSize--;
                    font = new Font(this.familyName, fontSize, FontStyle.Bold);
                    size = g.MeasureString(this.text, font);
                } while ((size.Width / 4f )* 3f > rect.Width);

    // Set up the text format.
                StringFormat format = new StringFormat();
                format.Alignment = StringAlignment.Center;
                format.LineAlignment = StringAlignment.Center;

    // Create a path using the text and warp it randomly.
                GraphicsPath path = new GraphicsPath();
                path.AddString(this.text, font.FontFamily, (int)font.Style, font.Size, rect, format);
    float v = 4F;
                PointF[] points =
       {
    new PointF(Next(rect.Width) / v, Next(rect.Height) / v),
    new PointF(rect.Width - Next(rect.Width) / v, Next(rect.Height) / v),
    new PointF(Next(rect.Width) / v, rect.Height - Next(rect.Height) / v),
    new PointF(rect.Width - Next(rect.Width) / v, rect.Height - Next(rect.Height) / v)
       };
                Matrix matrix = new Matrix();
                matrix.Translate(0F, 0F);
                path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);

    // Draw the text.
                hatchBrush = new HatchBrush(HatchStyle.LargeConfetti, Color.Gray, Color.Gray);
                g.FillPath(hatchBrush, path);

    // Add some random noise.
    int m = Math.Max(rect.Width, rect.Height);
    for (int i = 0; i < (int)(rect.Width * rect.Height / 30F); i++)
                {
    int x = Next(rect.Width);
    int y = Next(rect.Height);
    int w = Next(m / 50);
    int h = Next(m / 50);
                    g.FillEllipse(hatchBrush, x, y, w, h);
                }

    // Clean up.
                font.Dispose();
                hatchBrush.Dispose();
                g.Dispose();

    // Set the image.
    this.image = bitmap;
            }

    /// <summary>
    /// 获取一个随机数
    /// </summary>
    /// <returns>int</returns>
    private int Next()
            {
                rand = new Random(unchecked((int)DateTime.Now.Ticks) * randseed++);

    return rand.Next();
            }
    /// <summary>
    /// 获取一个随机数
    /// </summary>
    /// <param name="maxValue">随机数的上界</param>
    /// <returns>int</returns>
    private int Next(int maxValue)
            {
                rand = new Random(unchecked((int)DateTime.Now.Ticks) * Next());

    return rand.Next(maxValue);
            }

    /// <summary>
    /// 获取一个随机数
    /// </summary>
    /// <param name="minValue">随机数的下界</param>
    /// <param name="maxValue">随机数的上界</param>
    /// <returns>int</returns>
    private int Next(int minValue, int maxValue)
            {
                rand = new Random(unchecked((int)DateTime.Now.Ticks) * Next());

    return rand.Next(minValue, maxValue);
            }
        }
    }

  • 相关阅读:
    kafka整理笔记笔记
    node(一)安装nodejs最新版到debian,ubuntu,mint系统
    ubuntu16.04安装visual-studio-code
    ubuntu16.04更新内核--使用4.6以上的内核会让用A卡的Dell电脑更快--及卸载多余内核
    linux查看主板型号及内存硬件信息,及硬盘测速
    git使用,在ubuntu中
    Ubuntu中文目录文件夹改为英文
    w3m 在ubuntu中的使用
    关于右键属性与du -sh显示的文件大小不一致的解决
    ubuntu16.04安装chrome
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1799671.html
Copyright © 2020-2023  润新知