• DZ.NET论坛的图片验证码(原)


    作了些改动,呵呵,以前他的那个数字是要根据在线用户来计算的,我改成随机的了,现在把源码贴出来
    getcode.aspx代码如下
     1using System;
     2using System.Data;
     3using System.Configuration;
     4using System.Collections;
     5using System.Web;
     6using System.Web.Security;
     7using System.Web.UI;
     8using System.Web.UI.WebControls;
     9using System.Web.UI.WebControls.WebParts;
    10using System.Web.UI.HtmlControls;
    11using System.IO;
    12using System.Drawing;
    13using System.Drawing.Imaging;
    14using System.Text;
    15public partial class GetCode : System.Web.UI.Page
    16{
    17    protected void Page_Load(object sender, EventArgs e)
    18    {
    19        Response.Expires = 0;
    20        Response.CacheControl = "no-cache";
    21        int number;
    22        char code;
    23        string checkCode = String.Empty;
    24        System.Random random = new Random();
    25        for (int i = 0; i < 5; i++)
    26        {
    27            number = random.Next();
    28            code = (char)('0' + (char)(number % 10));
    29            checkCode += code.ToString();
    30        }

    31        Session["getcode"= checkCode;
    32        VerifyImage vi = new VerifyImage(checkCode, 9040);
    33        Bitmap image = vi.Image;
    34        System.Web.HttpContext.Current.Response.ContentType = "image/pjpeg";
    35        image.Save(this.Response.OutputStream, ImageFormat.Jpeg);
    36    }

    37}

    38

    VerifyImage.cs代码如下
      1using System;
      2using System.Data;
      3using System.Configuration;
      4using System.Web;
      5using System.Web.Security;
      6using System.Web.UI;
      7using System.Web.UI.WebControls;
      8using System.Web.UI.WebControls.WebParts;
      9using System.Web.UI.HtmlControls;
     10using System.IO;
     11using System.Drawing;
     12using System.Drawing.Drawing2D;
     13using System.Drawing.Imaging;
     14using System.Drawing.Text;
     15using System.Security.Cryptography;
     16
     17/// <summary>
     18/// 验证码图片类
     19/// </summary>

     20public class VerifyImage
     21{
     22    /// <summary>
     23    /// 要显示的文字
     24    /// </summary>

     25    public string Text
     26    {
     27        get return this.text; }
     28    }

     29    /// <summary>
     30    /// 图片
     31    /// </summary>

     32    public Bitmap Image
     33    {
     34        get return this.image; }
     35    }

     36    /// <summary>
     37    /// 宽度
     38    /// </summary>

     39    public int Width
     40    {
     41        get return this.width; }
     42    }

     43    /// <summary>
     44    /// 高度
     45    /// </summary>

     46    public int Height
     47    {
     48        get return this.height; }
     49    }

     50
     51    private string text;
     52    private int width;
     53    private int height;
     54    private Bitmap image;
     55
     56    private static byte[] randb = new byte[4];
     57    private static RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();
     58
     59    /// <summary>
     60    /// 构造函数
     61    /// </summary>
     62    /// <param name="code">要显示的验证码</param>
     63    /// <param name="width">宽度</param>
     64    /// <param name="height">高度</param>

     65    public VerifyImage(string code, int width, int height)
     66    {
     67        this.text = code;
     68        this.width = width;
     69        this.height = height;
     70        this.GenerateImage();
     71
     72    }

     73
     74    ~VerifyImage()
     75    {
     76        Dispose(false);
     77    }

     78
     79    public void Dispose()
     80    {
     81        GC.SuppressFinalize(this);
     82        this.Dispose(true);
     83    }

     84
     85    protected virtual void Dispose(bool disposing)
     86    {
     87        if (disposing)
     88            this.image.Dispose();
     89    }

     90    private FontFamily[] fonts = {
     91                                         new FontFamily("Times New Roman"),
     92                                         new FontFamily("Georgia"),
     93                                         new FontFamily("Arial"),
     94                                         new FontFamily("Comic Sans MS")
     95                                     }
    ;
     96
     97    /// <summary>
     98    /// 获得下一个随机数
     99    /// </summary>
    100    /// <returns></returns>

    101    public static int Next()
    102    {
    103        rand.GetBytes(randb);
    104        int value = BitConverter.ToInt32(randb, 0);
    105        if (value < 0) value = -value;
    106        return value;
    107    }

    108
    109    /// <summary>
    110    /// 获得下一个随机数
    111    /// </summary>
    112    /// <param name="max">最大值</param>
    113    /// <returns></returns>

    114    public static int Next(int max)
    115    {
    116        rand.GetBytes(randb);
    117        int value = BitConverter.ToInt32(randb, 0);
    118        value = value % (max + 1);
    119        if (value < 0) value = -value;
    120        return value;
    121    }

    122
    123    /// <summary>
    124    /// 获得下一个随机数
    125    /// </summary>
    126    /// <param name="min">最小值</param>
    127    /// <param name="max">最大值</param>
    128    /// <returns></returns>

    129    public static int Next(int min, int max)
    130    {
    131        int value = Next(max - min) + min;
    132        return value;
    133    }

    134
    135
    136    /// <summary>
    137    /// 生成验证码图片
    138    /// </summary>

    139    private void GenerateImage()
    140    {
    141        Bitmap bitmap = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);
    142
    143        Graphics g = Graphics.FromImage(bitmap);
    144        Rectangle rect = new Rectangle(00this.width, this.height);
    145        g.SmoothingMode = SmoothingMode.AntiAlias;
    146
    147        g.Clear(Color.White);
    148
    149        int emSize = Next(3+ 15;//(int)((this.width - 20) * 2 / text.Length);
    150        FontFamily family = fonts[Next(fonts.Length - 1)];
    151        Font font = new Font(family, emSize, FontStyle.Bold);
    152
    153        SizeF measured = new SizeF(00);
    154        SizeF workingSize = new SizeF(this.width, this.height);
    155        while (emSize > 2 && (measured = g.MeasureString(text, font)).Width > workingSize.Width || measured.Height > workingSize.Height)
    156        {
    157            font.Dispose();
    158            font = new Font(family, emSize -= 2);
    159        }

    160
    161        SolidBrush drawBrush = new SolidBrush(Color.FromArgb(Next(100), Next(100), Next(100)));
    162        for (int x = 0; x < 3; x++)
    163        {
    164            Pen linePen = new Pen(Color.FromArgb(Next(150), Next(150), Next(150)), 1);
    165            g.DrawLine(linePen, new PointF(0.0F + Next(20), 0.0F + Next(this.height)), new PointF(0.0F + Next(this.width), 0.0F + Next(this.height)));
    166        }

    167
    168        for (int x = 0; x < this.text.Length; x++)
    169        {
    170            drawBrush.Color = Color.FromArgb(Next(150+ 20, Next(150+ 20, Next(150+ 20);
    171            PointF drawPoint = new PointF(0.0F + Next(4+ x * 158.0F + Next(4));
    172            g.DrawString(this.text[x].ToString(), font, drawBrush, drawPoint);
    173        }

    174
    175        double distort = Next(510* (Next(10== 1 ? 1 : -1);
    176
    177        using (Bitmap copy = (Bitmap)bitmap.Clone())
    178        {
    179            for (int y = 0; y < height; y++)
    180            {
    181                for (int x = 0; x < width; x++)
    182                {
    183                    int newX = (int)(x + (distort * Math.Sin(Math.PI * y / 84.0)));
    184                    int newY = (int)(y + (distort * Math.Cos(Math.PI * x / 54.0)));
    185                    if (newX < 0 || newX >= width) newX = 0;
    186                    if (newY < 0 || newY >= height) newY = 0;
    187                    bitmap.SetPixel(x, y, copy.GetPixel(newX, newY));
    188                }

    189            }

    190        }

    191
    192
    193        //g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1);
    194
    195        font.Dispose();
    196        drawBrush.Dispose();
    197        g.Dispose();
    198
    199        this.image = bitmap;
    200    }

    201}

    202
  • 相关阅读:
    调用网易有道词典api
    函数设计
    参数2
    新浪微博API使用初步介绍——解决回调地址的问题
    参数关键点和return返回多个(伪多个)值问题
    函数基本理论
    一个值得思考的例子
    Beego基础学习(五)Golang原生sql操作Mysql数据库增删改查(基于Beego下测试)
    Golang利用select实现超时机制
    Golang利用select和普通函数分别实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/icejd/p/945701.html
Copyright © 2020-2023  润新知