专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 验证码源码:C#实现返回验证码图片的类库源码 »正文

验证码源码:C#实现返回验证码图片的类库源码

来源: 发布时间:星期三, 2008年9月10日 浏览:194次 评论:0
验证码字符个数、生成图片宽度、高度自定均可由构造方法自定,无参构造生成默认字符个数和默认大小的Image,方法 GetImgWithValidateCode()返回生成的验证码图片,方法 IsRight(string inputValCode) 判断用户输入的验证码 inputValCode与

图片显示的字符是否一致,不区分大小写

using System;
using System.IO;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace DrawValidateImageLib
{
public class DrawValImg
{
/// <summary>
/// 无参构造
/// </summary>
public DrawValImg() { }
/// <summary>
/// 带有生成字符个数的构造
/// </summary>
/// <param name="charNum">验证码中包含随机字符的个数</param>
public DrawValImg(int charNum)
{
this.CharNum = charNum;
}
/// <summary>
/// 带有验证码图片宽度和高度的构造
/// </summary>
/// <param name="width">验证码图片宽度</param>
/// <param name="height">验证码图片高度</param>
public DrawValImg(int width,int height)
{
this.width = width;
this.height = height;
}
/// <summary>
/// 带有生成字符个数,验证码图片宽度和高度的构造
/// </summary>
/// <param name="charNum">验证码中包含随机字符的个数</param>
/// <param name="width">验证码图片宽度</param>
/// <param name="height">验证码图片高度</param>
public DrawValImg(int charNum,int width,int height)
{
this.CharNum = charNum;
this.width = width;
this.height = height;
}

/// <summary>
/// 验证码中字符个数
/// </summary>
int charNum = 5; //默认字符个数为5

public int CharNum
{
get { return charNum; }
set { charNum = value; }
}
/// <summary>
/// 字号
/// </summary>
int fontSize = 20;

public int FontSize
{
get { return fontSize; }
}
/// <summary>
/// 图片宽度
/// </summary>
int width=200;

public int Width
{
get { return width; }
}

/// <summary>
/// 图片高度
/// </summary>
int height=45;

public int Height
{
get { return height; }
set { height = value; }
}

/// <summary>
/// 随机生成的字符串
/// </summary>
string validStr="";

public string ValidStr
{
get { return validStr; }
set { validStr = value; }
}

/// <summary>
/// 产生指定个数的随机字符串,默认字符个数为5
/// </summary>
void GetValidateCode()
{
Random rd = new Random(); //创建随机数对象

//产生由 charNum 个字母或数字组成的一个字符串
string str = "abcdefghijkmnpqrstuvwyzABCDEFGHJKLMNPQRSTUVWYZ23456789田国兴";//共57个字符,除 l,o,x,I,O,X,1,0 的所有数字和大写字母
for (int i = 0; i < charNum; i++)
{
validStr = validStr + str.Substring(rd.Next(57), 1);//返回0到56共57个
}

}

/// <summary>
/// 由随机字符串,随即颜色背景,和随机线条产生的Image
/// </summary>
/// <returns>Image</returns>
public Image GetImgWithValidateCode()//返回 Image
{
//产生随机字符串
GetValidateCode();

//声明一个位图对象
Bitmap bitMap = null;
//声明一个绘图画面
Graphics gph = null;
//创建内存流
MemoryStream memStream = new MemoryStream();

Random random = new Random();

//由给定的需要生成字符串中字符个数 CharNum, 图片宽度 Width 和高度 Height 确定字号 FontSize,
//确保不因字号过大而不能全部显示在图片上
int fontWidth=(int)Math.Round(width/(charNum+2)/1.3);
int fontHeight=(int)Math.Round(height/1.5);
//字号取二者中小者,以确保所有字符能够显示,并且字符的下半部分也能显示
fontSize = fontWidth <= fontHeight ? fontWidth : fontHeight;

//创建位图对象
bitMap = new Bitmap(width+FontSize,height);
//根据上面创建的位图对象创建绘图图面
gph = Graphics.FromImage(bitMap);

//设定验证码图片背景色
gph.Clear(GetControllableColor(200));
//产生随机干扰线条
for (int i = 0; i < 10; i++)
{
Pen backPen = new Pen(GetControllableColor(100), 2);
//线条起点
int x = random.Next(width);
int y = random.Next(height);
//线条终点
int x2 = random.Next(width);
int y2 = random.Next(height);
//划线
gph.DrawLine(backPen, x, y, x2, y2);
}

//定义一个含10种字体的数组
String[] fontFamily ={ "Arial", "Verdana", "Comic Sans MS", "Impact", "Haettenschweiler",
"Lucida Sans Unicode", "Garamond", "Courier New", "Book Antiqua", "Arial Narrow" };

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: