随笔之生成简单的验证码

由于验证码应用于网站很常见,笔者在这记录下以前用到过的一种生成验证码的简单方法。

基本思路:

1..新建2个web 页面:default.aspx和CreateImage.aspx。

2.准备在CreateImage.cs文件中写2个方法,一个是Createval(int length);另一个是 CreateImg(string val)。第一个方法用来产生随机数拼成的字符串;第二个方法传入的参数是第一个方法产生的字串,并生成图片。

3.在default.aspx页面显示CreateImage.aspx产生的图片

default.aspx具体的代码如下:

View Code
<head runat="server">
    <title></title>
    <script language="javascript" type="text/javascript" >
        function getimg() {
            //document.getElementById("imgcode").src = "CreateImage.aspx";因为src地址和img默认src相同,click之后不会改变,所以我这里加了一个date参数
            document.getElementById("imgcode").src = "CreateImage.aspx?date=" + escape(new Date().getTime().toString(36));
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <img id="imgcode" alt=""  src="CreateImage.aspx" onclick="getimg()" />
    <!--第二种方法 -->
    <a href="#" onclick="document.getElementById('imgcode').src='CreateImage.aspx?temp='+ (new Date().getTime().toString(36)); return false">产生验证码</a> 

    </div>
    </form>
</body>

CreateImage.cs具体代码如下:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;

public partial class CreateImage : System.Web.UI.Page
{
    public static string sessionkey;////此处用来保存验证码到Session的Key的名称 
    private const int ImageHeigth = 22;             //验证码图片的高度 
    private const double ImageLengthBase = 12.5;    //验证码图片中每个字符的宽度 
    private const int ImageLineNumber = 25;         //噪音线的数量 
    private const int ImagePointNumber = 100;       //噪点的数量 
    protected void Page_Load(object sender, EventArgs e)
    {
        string val = Createval(4);
        CreateImg(val);
    }

    /// <summary>
    /// 产生4位随即数拼成的字串
    /// </summary>
    /// <param name="length"></param>
    /// <returns></returns>
    public string Createval(int length)
    {
        StringBuilder returnvalue = new StringBuilder ();
        string temp = "0123456789abcdefghijklmnopqrstuvwxyz";
        Random rd = new Random();
        for (int i = 0; i < length;i++ )
        {
            returnvalue.Append(temp[rd.Next(0, 36)]);
        }
        Session[sessionkey] = returnvalue;//把生成的字串存入session中,以便在default页面比对输入的字符串是否与此处生成的相同,达到验证的作用
        return returnvalue.ToString();
    }
    /// <summary>
    /// 生成图片
    /// </summary>
    /// <param name="val"></param>
    public void CreateImg(string val)
    {
        if (!string.IsNullOrEmpty(val))
        {
            this.Session[sessionkey] = val;
            //初始化位图Bitmap对象,指定图片对象的大小(宽,高) 
            Bitmap image = new Bitmap((int)Math.Ceiling((double)(val.Length * ImageLengthBase)), ImageHeigth);
            //初始化一块画布 
            Graphics graphics = Graphics.FromImage(image);
            Random random = new Random();
            try
            {
                int num5;
                graphics.Clear(Color.White);
                //绘制噪音线 
                for (num5 = 0; num5 < ImageLineNumber; num5++)
                {
                    int num = random.Next(image.Width);
                    int num3 = random.Next(image.Height);
                    int num2 = random.Next(image.Width);
                    int num4 = random.Next(image.Height);
                    graphics.DrawLine(new Pen(Color.Silver), num, num3, num2, num4);
                }
                //验证码字体样式 
                Font font = new Font("Tahoma", 12, FontStyle.Italic | FontStyle.Bold);
                LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
                //绘制验证码到画布 
                graphics.DrawString(val, font, brush, (float)2, (float)2);
                //绘制噪点 
                for (num5 = 0; num5 < ImagePointNumber; num5++)
                {
                    int x = random.Next(image.Width);
                    int y = random.Next(image.Height);
                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }
                graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                MemoryStream stream = new MemoryStream();
                //保存图片 
                image.Save(stream, ImageFormat.Gif);
                base.Response.ClearContent();
                base.Response.ContentType = "image/Gif";
                base.Response.BinaryWrite(stream.ToArray());
            }
            finally
            {
                graphics.Dispose();
                image.Dispose();
            }
        } 

    }
}

特别说明:生成图片的方法我是从网上找的,仅用来学习。

 

posted @ 2012-09-06 22:07  SKY_LEO  阅读(222)  评论(0)    收藏  举报