纸上得来终觉浅,绝知此事要躬行。

 

验证码生成类

生成Image的类:

生成Image的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Security.Cryptography;

namespace WebAppToBuildImage
{
    /// <summary>
    /// 验证码图片类
    /// </summary>
    public class VerifyImageEntity
    {
        /// <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; }
        }

        private string text;
        private int width;
        private int height;
        private Bitmap image;

        private static byte[] randb = new byte[4];
        private static RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="code">要显示的验证码</param>
        /// <param name="width">宽度</param>
        /// <param name="height">高度</param>
        public VerifyImageEntity(string code, int width, int height)
        {
            this.text = code;
            this.width = width;
            this.height = height;
            this.GenerateImage();

        }

        /// <summary>
        /// 析构函数
        /// </summary>
        ~VerifyImageEntity()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            GC.SuppressFinalize(this);
            this.Dispose(true);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
                this.image.Dispose();
        }
        private FontFamily[] fonts = {
                                new FontFamily("Times New Roman"),
                                new FontFamily("Georgia"),
                                new FontFamily("Arial"),
                                new FontFamily("Comic Sans MS")
                            };


        public static int Next()
        {
            rand.GetBytes(randb);
            int value = BitConverter.ToInt32(randb, 0);
            if (value < 0) value = -value;
            return value;
        }

        public static int Next(int max)
        {
            rand.GetBytes(randb);
            int value = BitConverter.ToInt32(randb, 0);
            value = value % (max + 1);
            if (value < 0) value = -value;
            return value;
        }

        public static int Next(int min, int max)
        {
            int value = Next(max - min) + min;
            return value;
        }


        /// <summary>
        /// 生成验证码图片
        /// </summary>
        private void GenerateImage()
        {
            Bitmap bitmap = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);

            Graphics g = Graphics.FromImage(bitmap);
            Rectangle rect = new Rectangle(0, 0, this.width, this.height);
            g.SmoothingMode = SmoothingMode.AntiAlias;

            g.Clear(Color.White);

            int emSize = Next(3) + 18;//(int)((this.width - 20) * 2 / text.Length);
            FontFamily family = fonts[Next(fonts.Length - 1)];
            Font font = new Font(family, emSize, FontStyle.Bold);

            SizeF measured = new SizeF(0, 0);
            SizeF workingSize = new SizeF(this.width, this.height);
            while (emSize > 2 && (measured = g.MeasureString(text, font)).Width > workingSize.Width || measured.Height > workingSize.Height)
            {
                font.Dispose();
                font = new Font(family, emSize -= 2);
            }

            SolidBrush drawBrush = new SolidBrush(Color.FromArgb(Next(100), Next(100), Next(100)));
            for (int x = 0; x < 3; x++)
            {
                Pen linePen = new Pen(Color.FromArgb(Next(150), Next(150), Next(150)), 1);
                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)));
            }

            for (int x = 0; x < this.text.Length; x++)
            {
                drawBrush.Color = Color.FromArgb(Next(150) + 20, Next(150) + 20, Next(150) + 20);
                PointF drawPoint = new PointF(0.0F + Next(4) + x * 15, 8.0F + Next(4));
                g.DrawString(this.text[x].ToString(), font, drawBrush, drawPoint);
            }

            double distort = Next(5, 10) * (Next(10) == 1 ? 1 : -1);

            using (Bitmap copy = (Bitmap)bitmap.Clone())
            {
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        int newX = (int)(x + (distort * Math.Sin(Math.PI * y / 84.0)));
                        int newY = (int)(y + (distort * Math.Cos(Math.PI * x / 54.0)));
                        if (newX < 0 || newX >= width) newX = 0;
                        if (newY < 0 || newY >= height) newY = 0;
                        bitmap.SetPixel(x, y, copy.GetPixel(newX, newY));
                    }
                }
            }
            //g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1);
            font.Dispose();
            drawBrush.Dispose();
            g.Dispose();

            this.image = bitmap;
        }
    }
}

添加一个img.aspx页面用于显示image:

img.aspx
<%@ Page Title="主页" Language="C#" AutoEventWireup="true" ContentType="image/jpeg"
    CodeBehind="img.aspx.cs" Inherits="WebAppToBuildImage._Default" %>
img.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;

namespace WebAppToBuildImage
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            string authStr = CreateAuthStr(4);
            System.Diagnostics.Debug.WriteLine(authStr);

            VerifyImageEntity verifyimg = new VerifyImageEntity(authStr, 100, 35);

            System.Drawing.Bitmap image = verifyimg.Image;

            System.Web.HttpContext.Current.Response.ContentType = "image/pjpeg";

            //Session["AuthStr"] = authStr.ToLower();

            image.Save(this.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

        /// <summary>
        /// 产生验证码
        /// </summary>
        /// <returns>验证码</returns>
        public static string CreateAuthStr(int len)
        {
            int number;
            StringBuilder checkCode = new StringBuilder();

            Random random = new Random();

            for (int i = 0; i < len; i++)
            {
                number = random.Next();

                if (number % 2 == 0)
                {
                    checkCode.Append((char)('0' + (char)(number % 10)));
                }
                else
                {
                    checkCode.Append((char)('A' + (char)(number % 26)));
                }

            }

            return checkCode.ToString();
        }
    }
}

调用[看高亮那一句]:

<%@ Page Title="关于我们" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="About.aspx.cs" Inherits="WebAppToBuildImage.About" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('#next').click(function () {
                $("#imgSl").attr("src", "img.aspx");
            });
        });
    </script>
    <style type="text/css">
        img{border:1px solid #ccc; padding:0px; margin:0px;}
        body{font-size:12px;}
        a:hover{color:#1D60FF; text-decoration:none;}
        #pannel1{margin-top:15px; height:35px; float:left;}
        #pannel2{margin-top:15px; height:35px; float:left; padding-top:10px; margin-left:5px;}
    </style>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        关于
    </h2>
    <div id="pannel1">
        <img id="imgSl" src="img.aspx" alt="img" width="100" height="30"/>
    </div>
    <div id="pannel2">
        <a id="next" style="height:20px; width:60px; cursor:pointer; margin-top:-10px;">换一张?</a>
    </div>
</asp:Content>

posted on 2012-06-27 13:32  JRoger  阅读(276)  评论(0)    收藏  举报

导航