主要用到一个类,一个aspx页面,还有一个使用图片验证码的aspx页面。
随机图片生成类:
using
System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace Sooyie.Common
{
/// <summary>
/// 产生随即图片
/// </summary>
public sealed class RandImage
{
private const string RandCharString = " 0123456789 " ;
private int width;
private int height;
private int length;
/// <summary>
/// 默认构造函数,生成的图片宽度为48×24,随即字符串字符个数
/// </summary>
public RandImage(): this ( 48 , 24 , 4 )
{
}
/// <summary>
/// 指定生成图片的宽和高,默认生成图片的字符串长度为4个字符
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
public RandImage( int width, int height): this (width,height, 4 )
{
}
/// <summary>
/// 指定生成图片的宽和高以及生成图片的字符串字符个数
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="length"></param>
public RandImage( int width, int height, int length)
{
this .width = width;
this .height = height;
this .length = length;
}
/// <summary>
/// 以默认的大小和默认的字符个数产生图片
/// </summary>
/// <returns></returns>
public Image GetImage()
{
Bitmap image = new Bitmap(width, height);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
string randString = "" ;
Random random = new Random();
do
{
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace Sooyie.Common
{
/// <summary>
/// 产生随即图片
/// </summary>
public sealed class RandImage
{
private const string RandCharString = " 0123456789 " ;
private int width;
private int height;
private int length;
/// <summary>
/// 默认构造函数,生成的图片宽度为48×24,随即字符串字符个数
/// </summary>
public RandImage(): this ( 48 , 24 , 4 )
{
}
/// <summary>
/// 指定生成图片的宽和高,默认生成图片的字符串长度为4个字符
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
public RandImage( int width, int height): this (width,height, 4 )
{
}
/// <summary>
/// 指定生成图片的宽和高以及生成图片的字符串字符个数
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="length"></param>
public RandImage( int width, int height, int length)
{
this .width = width;
this .height = height;
this .length = length;
}
/// <summary>
/// 以默认的大小和默认的字符个数产生图片
/// </summary>
/// <returns></returns>
public Image GetImage()
{
Bitmap image = new Bitmap(width, height);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
string randString = "" ;
Random random = new Random();
do
{
//使用DateTime.Now.Millisecond作为生成随机数的参数,增加随机性
randString += RandCharString.Substring(random.Next( DateTime.Now.Millisecond) % RandCharString.Length, 1 );
}
while (randString.Length < 4 );
float emSize = ( float )width / randString.Length;
Font font = new Font( " Arial " , emSize, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
Pen pen = new Pen(Color.Silver);
#region 画图片的背景噪音线
int x1,y1,x2,y2;
for ( int i = 0 ; i < 25 ; i ++ )
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
x2 = random.Next(image.Width);
y2 = random.Next(image.Height);
g.DrawLine(pen, x1, y1, x2, y2);
}
#endregion
#region 画图片的前景噪音点
for ( int i = 0 ; i < 100 ; i ++ )
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
image.SetPixel(x1, y1, Color.FromArgb(random.Next(Int32.MaxValue)));
}
#endregion
g.DrawString(randString, font, Brushes.Red, 2 , 2 );
g.Dispose();
return image;
}
}
}
randString += RandCharString.Substring(random.Next( DateTime.Now.Millisecond) % RandCharString.Length, 1 );
}
while (randString.Length < 4 );
float emSize = ( float )width / randString.Length;
Font font = new Font( " Arial " , emSize, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
Pen pen = new Pen(Color.Silver);
#region 画图片的背景噪音线
int x1,y1,x2,y2;
for ( int i = 0 ; i < 25 ; i ++ )
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
x2 = random.Next(image.Width);
y2 = random.Next(image.Height);
g.DrawLine(pen, x1, y1, x2, y2);
}
#endregion
#region 画图片的前景噪音点
for ( int i = 0 ; i < 100 ; i ++ )
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
image.SetPixel(x1, y1, Color.FromArgb(random.Next(Int32.MaxValue)));
}
#endregion
g.DrawString(randString, font, Brushes.Red, 2 , 2 );
g.Dispose();
return image;
}
}
}
将图片转换成html资源的aspx页面,这个页面前台没有任何代码,主要后台(.cs)的功能。
using
System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Sooyie.Common;
public partial class CheckImage : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( ! Page.IsPostBack)
{
RandImage randImage = new RandImage();
System.Drawing.Image image = randImage.GetImage();
System.IO.MemoryStream memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = " image/gif " ;
Response.BinaryWrite(memoryStream.ToArray());
image.Dispose();
Response.End();
}
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Sooyie.Common;
public partial class CheckImage : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( ! Page.IsPostBack)
{
RandImage randImage = new RandImage();
System.Drawing.Image image = randImage.GetImage();
System.IO.MemoryStream memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = " image/gif " ;
Response.BinaryWrite(memoryStream.ToArray());
image.Dispose();
Response.End();
}
}
}
下面是怎么使用的例子:
<%
@ Page Language
=
"
C#
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
Login.aspx.cs
"
Inherits
=
"
Admin_Login
"
%>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > 后台管理用户登录 </ title >
</ head >
< body >
< form id ="form1" runat ="server" >
< div >
< table border ="0" cellpadding ="0" cellspacing ="0" width ="480" >
< tr >
< td colspan ="2" align ="center" >
公文管理系统后台登陆 </ td >
</ tr >
< tr >
< td style ="width: 83px" >
用户名 </ td >< td >
< asp:TextBox ID ="txtUserName" runat ="server" ></ asp:TextBox >
< asp:RequiredFieldValidator ID ="RequiredFieldValidator1" runat ="server" ControlToValidate ="txtUserName"
ErrorMessage ="用户名" ></ asp:RequiredFieldValidator ></ td >
</ tr >
< tr >
< td style ="height: 19px; width: 83px;" >
密码 </ td >< td >
< asp:TextBox ID ="txtPassword" runat ="server" TextMode ="Password" ></ asp:TextBox >
< asp:RequiredFieldValidator ID ="RequiredFieldValidator2" runat ="server" ControlToValidate ="txtPassword"
ErrorMessage ="密码" ></ asp:RequiredFieldValidator ></ td >
</ tr >
< tr >
< td style ="height: 19px; width: 83px;" >
校验码 </ td >< td >
< asp:TextBox ID ="txtCheckCode" runat ="server" ></ asp:TextBox >< img src ="CheckImage.aspx" alt ="校验码" />
< asp:RequiredFieldValidator ID ="RequiredFieldValidator3" runat ="server" ControlToValidate ="txtCheckCode"
ErrorMessage ="校验码必填" ></ asp:RequiredFieldValidator ></ td >
</ tr >
< tr >
< td style ="width: 83px" >
< asp:Button ID ="btnLogin" runat ="server" Text ="登陆" OnClick ="btnLogin_Click" /></ td >< td style ="width: 9px" >
< input id ="Reset1" type ="reset" value ="清除" /></ td >
</ tr >
</ table >
</ div >
< asp:Literal ID ="lStatus" runat ="server" Visible ="False" ></ asp:Literal >
</ form >
</ body >
</ html >
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > 后台管理用户登录 </ title >
</ head >
< body >
< form id ="form1" runat ="server" >
< div >
< table border ="0" cellpadding ="0" cellspacing ="0" width ="480" >
< tr >
< td colspan ="2" align ="center" >
公文管理系统后台登陆 </ td >
</ tr >
< tr >
< td style ="width: 83px" >
用户名 </ td >< td >
< asp:TextBox ID ="txtUserName" runat ="server" ></ asp:TextBox >
< asp:RequiredFieldValidator ID ="RequiredFieldValidator1" runat ="server" ControlToValidate ="txtUserName"
ErrorMessage ="用户名" ></ asp:RequiredFieldValidator ></ td >
</ tr >
< tr >
< td style ="height: 19px; width: 83px;" >
密码 </ td >< td >
< asp:TextBox ID ="txtPassword" runat ="server" TextMode ="Password" ></ asp:TextBox >
< asp:RequiredFieldValidator ID ="RequiredFieldValidator2" runat ="server" ControlToValidate ="txtPassword"
ErrorMessage ="密码" ></ asp:RequiredFieldValidator ></ td >
</ tr >
< tr >
< td style ="height: 19px; width: 83px;" >
校验码 </ td >< td >
< asp:TextBox ID ="txtCheckCode" runat ="server" ></ asp:TextBox >< img src ="CheckImage.aspx" alt ="校验码" />
< asp:RequiredFieldValidator ID ="RequiredFieldValidator3" runat ="server" ControlToValidate ="txtCheckCode"
ErrorMessage ="校验码必填" ></ asp:RequiredFieldValidator ></ td >
</ tr >
< tr >
< td style ="width: 83px" >
< asp:Button ID ="btnLogin" runat ="server" Text ="登陆" OnClick ="btnLogin_Click" /></ td >< td style ="width: 9px" >
< input id ="Reset1" type ="reset" value ="清除" /></ td >
</ tr >
</ table >
</ div >
< asp:Literal ID ="lStatus" runat ="server" Visible ="False" ></ asp:Literal >
</ form >
</ body >
</ html >
请注意:<img src="CheckImage.aspx" alt="校验码" />这一句就使用了CheckImage.aspx.cs类中的功能,将图片通过HTTP输出。