zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/icejd/p/945701.html
Copyright © 2011-2022 走看看