登录验证码其实可以分为两个部分,一是生产一组随机数,二是将这组随机数画出来。当然利用了C#的绘图功能。
所以现在自定义两个函数,
CreateCheckCode()//该函数用于产生一组随机数,及验证码
createcheckcodeImage(string CheckCode)//该函数用于画一张图片,而参数CheckCode则是之前随机产生的验证码
using System.Drawing;
public partial class CheckCode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ //在网页一加载的时候便调用这两个函数,以产生验证码
createcheckcodeImage(CreateCheckCode());
}
public String CreateCheckCode()
{
int number;
char code;
Random randomnumber=new Random();//C#中使用随机数时声明一个Random类的对象,而Java直接使用Math.random()
String CheckCode = String.Empty;//声明一个字符串,并把它置为空。
for(int i=0;i<4;i++)//i值控制验证码的位数,这里设置为4位
{
number = randomnumber.Next();//产生一个随机数
//以下方法用来判断显示数字还是字母,当然也可以自己设计其他方法。48和55为ASCII码
number=number % 36;
if (number < 10)
{
number += 48;
}
else
{
number += 55;
}
CheckCode += ((char)number).ToString();//number为Int,转换为char后在相加就成了字符串数组.
}
return CheckCode;
}
public void createcheckcodeImage(string CheckCode)
{
System.Drawing.Bitmap image = new System.Drawing.Bitmap(55, 20);//创建一张Bitmap类型的图片对象。两个参数为图片大小
Graphics g = Graphics.FromImage(image);//从指定的 Image 创建新的 Graphics,Graphics 类提供将对象绘制到显示设备的方法 //Graphics 与特定的设备上下文关联。
Random random = new Random();
g.Clear(Color.White);//将图片清空
//验证码上有一些干扰的线,以下便是画这些线,i控制画线的条数,作用是干扰视觉
for (int i = 0; i < 10; i++)
{
//利用随机数产生画线要用的4个坐标,Next里面的参数是随机数的最大值,当然不能超过图片的范围。
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);//详见MSDN中的DrawLine函数
}
Font font = new Font("Arial",12,(FontStyle.Bold|FontStyle.Italic));//创建字体的对象,利用了Font的构造函数,详见MSDN
//创建渐变笔刷,利用了LinearGradientBrush的构造函数,详见MSDN
System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(CheckCode,font,brush,2,2);//绘制验证码,应为DrawString函数有参数font和brush,所以要在前面构造
for (int i = 0; i < 10; i++)//画一些点,作用是干扰视觉
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
g.DrawRectangle(new Pen(Color.Peru), 0, 0, image.Width - 1, image.Height - 1);//绘制由坐标对、宽度和高度指定的矩形
System.IO.MemoryStream ms = new System.IO.MemoryStream();// 创建其支持存储区为内存的流。
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//将此图像以指定的格式保存到指定的流中。
Response.ClearContent();//清除缓冲区流中的所有内容输出。
Response.ContentType = "image/GIF";//获取或设置输出流的 HTTP MIME 类型
Response.BinaryWrite(ms.ToArray());//该2进制字符串写入到输出流中
}
}