验证码生成类
生成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:

<%@ Page Title="主页" Language="C#" AutoEventWireup="true" ContentType="image/jpeg" CodeBehind="img.aspx.cs" Inherits="WebAppToBuildImage._Default" %>

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>
本博客内容,如需转载请务必保留超链接。Contact Me:Mail此处省略好几个字...