namespace
Kissogram.Common.Security
{
using System;
using System.IO;
using System.Web;
using System.Drawing;
// GIF验证码类
public class Validate
{
// 设置最少4位验证码
private byte TrueValidateCodeCount = 4 ;
public byte ValidateCodeCount
{
get
{
return TrueValidateCodeCount;
}
set
{
// 验证码至少为3位
if (value > 4 )
TrueValidateCodeCount = value;
}
}
protected string ValidateCode = "" ;
// 是否消除锯齿
public bool FontTextRenderingHint = false ;
// 验证码字体
public string ValidateCodeFont = " Arial " ;
// 验证码型号(像素)
public float ValidateCodeSize = 13 ;
public int ImageHeight = 23 ;
// 定义验证码中所有的字符
public string AllChar = " 1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z " ;
// 获得随机四位数
private void CreateValidate()
{
ValidateCode = "" ;
// 将验证码中所有的字符保存在一个字符串数组中
string [] CharArray = AllChar.Split( ' , ' );
int Temp = - 1 ;
// 生成一个随机对象
Random RandCode = new Random();
// 根据验证码的位数循环
for ( int i = 0 ; i < ValidateCodeCount; i ++ )
{
// 主要是防止生成相同的验证码
if (Temp != - 1 )
{
// 加入时间的刻度
RandCode = new Random(i * Temp * (( int )DateTime.Now.Ticks));
}
int t = RandCode.Next( 35 );
if (Temp == t)
{
// 相等的话重新生成
CreateValidate();
}
Temp = t;
ValidateCode += CharArray[Temp];
}
// 错误检测,去除超过指定位数的验证码
if (ValidateCode.Length > TrueValidateCodeCount)
ValidateCode = ValidateCode.Remove(TrueValidateCodeCount);
}
// 生成一帧的BMP图象
private void CreateImageBmp( out Bitmap ImageFrame)
{
// 获得验证码字符
char [] CodeCharArray = ValidateCode.ToCharArray( 0 , ValidateCodeCount);
// 图像的宽度-与验证码的长度成一定比例
int ImageWidth = ( int )(TrueValidateCodeCount * ValidateCodeSize * 1.3 + 4 );
// 创建一个长20,宽iwidth的图像对象
ImageFrame = new Bitmap(ImageWidth, ImageHeight);
// 创建一个新绘图对象
Graphics ImageGraphics = Graphics.FromImage(ImageFrame);
// 清除背景色,并填充背景色
// Note:Color.Transparent为透明
ImageGraphics.Clear(Color.White);
// 绘图用的字体和字号
Font CodeFont = new Font(ValidateCodeFont, ValidateCodeSize, FontStyle.Bold);
// 绘图用的刷子大小
Brush ImageBrush = new SolidBrush(Color.Red);
// 字体高度计算
int FontHeight = ( int )Math.Max(ImageHeight - ValidateCodeSize - 3 , 2 );
// 创建随机对象
Random rand = new Random();
// 开始随机安排字符的位置,并画到图像里
for ( int i = 0 ; i < TrueValidateCodeCount; i ++ )
{
// 生成随机点,决定字符串的开始输出范围
int [] FontCoordinate = new int [ 2 ];
FontCoordinate[ 0 ] = ( int )(i * ValidateCodeSize + rand.Next( 1 )) + 3 ;
FontCoordinate[ 1 ] = rand.Next(FontHeight);
Point FontDrawPoint = new Point(FontCoordinate[ 0 ], FontCoordinate[ 1 ]);
// 消除锯齿操作
if (FontTextRenderingHint)
ImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;
else
ImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
// 格式化刷子属性-用指定的刷子、颜色等在指定的范围内画图
ImageGraphics.DrawString(CodeCharArray[i].ToString(), CodeFont, ImageBrush, FontDrawPoint);
}
ImageGraphics.Dispose();
}
// 处理生成的BMP
private void DisposeImageBmp( ref Bitmap ImageFrame)
{
// 创建绘图对象
Graphics ImageGraphics = Graphics.FromImage(ImageFrame);
// 创建铅笔对象
Pen ImagePen = new Pen(Color.Red, 1 );
// 创建随机对象
Random rand = new Random();
// 创建随机点
Point[] RandPoint = new Point[ 2 ];
// 随机画线
for ( int i = 0 ; i < 15 ; i ++ )
{
RandPoint[ 0 ] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));
RandPoint[ 1 ] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));
ImageGraphics.DrawLine(ImagePen, RandPoint[ 0 ], RandPoint[ 1 ]);
}
ImageGraphics.Dispose();
}
// 创建GIF动画
private void CreateImageGif()
{
Bitmap ImageFrame;
Kissogram.Drawing.Gif.AnimatedGifEncoder GifPic = new Kissogram.Drawing.Gif.AnimatedGifEncoder();
MemoryStream BmpMemory = new MemoryStream();
GifPic.Start();
// 确保视觉残留
GifPic.SetDelay( 5 );
// -1:no repeat,0:always repeat
GifPic.SetRepeat( 0 );
for ( int i = 0 ; i < 20 ; i ++ )
{
// 创建一帧的图像
CreateImageBmp( out ImageFrame);
// 生成随机线条
DisposeImageBmp( ref ImageFrame);
// 输出绘图,将图像保存到指定的流
ImageFrame.Save(BmpMemory, System.Drawing.Imaging.ImageFormat.Png);
GifPic.AddFrame(Image.FromStream(BmpMemory));
BmpMemory = new MemoryStream();
}
GifPic.OutPut( ref BmpMemory);
HttpContext.Current.Response.ClearContent();
// 配置输出类型
HttpContext.Current.Response.ContentType = " image/Gif " ;
// 输出内容
HttpContext.Current.Response.BinaryWrite(BmpMemory.ToArray());
BmpMemory.Close();
BmpMemory.Dispose();
}
// 输出验证码
public void OutPutValidate( string ValidateCodeSession)
{
CreateValidate();
CreateImageGif();
// 把生成的验证码输入到SESSION
HttpContext.Current.Session[ValidateCodeSession] = ValidateCode;
}
}
}
{
using System;
using System.IO;
using System.Web;
using System.Drawing;
// GIF验证码类
public class Validate
{
// 设置最少4位验证码
private byte TrueValidateCodeCount = 4 ;
public byte ValidateCodeCount
{
get
{
return TrueValidateCodeCount;
}
set
{
// 验证码至少为3位
if (value > 4 )
TrueValidateCodeCount = value;
}
}
protected string ValidateCode = "" ;
// 是否消除锯齿
public bool FontTextRenderingHint = false ;
// 验证码字体
public string ValidateCodeFont = " Arial " ;
// 验证码型号(像素)
public float ValidateCodeSize = 13 ;
public int ImageHeight = 23 ;
// 定义验证码中所有的字符
public string AllChar = " 1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z " ;
// 获得随机四位数
private void CreateValidate()
{
ValidateCode = "" ;
// 将验证码中所有的字符保存在一个字符串数组中
string [] CharArray = AllChar.Split( ' , ' );
int Temp = - 1 ;
// 生成一个随机对象
Random RandCode = new Random();
// 根据验证码的位数循环
for ( int i = 0 ; i < ValidateCodeCount; i ++ )
{
// 主要是防止生成相同的验证码
if (Temp != - 1 )
{
// 加入时间的刻度
RandCode = new Random(i * Temp * (( int )DateTime.Now.Ticks));
}
int t = RandCode.Next( 35 );
if (Temp == t)
{
// 相等的话重新生成
CreateValidate();
}
Temp = t;
ValidateCode += CharArray[Temp];
}
// 错误检测,去除超过指定位数的验证码
if (ValidateCode.Length > TrueValidateCodeCount)
ValidateCode = ValidateCode.Remove(TrueValidateCodeCount);
}
// 生成一帧的BMP图象
private void CreateImageBmp( out Bitmap ImageFrame)
{
// 获得验证码字符
char [] CodeCharArray = ValidateCode.ToCharArray( 0 , ValidateCodeCount);
// 图像的宽度-与验证码的长度成一定比例
int ImageWidth = ( int )(TrueValidateCodeCount * ValidateCodeSize * 1.3 + 4 );
// 创建一个长20,宽iwidth的图像对象
ImageFrame = new Bitmap(ImageWidth, ImageHeight);
// 创建一个新绘图对象
Graphics ImageGraphics = Graphics.FromImage(ImageFrame);
// 清除背景色,并填充背景色
// Note:Color.Transparent为透明
ImageGraphics.Clear(Color.White);
// 绘图用的字体和字号
Font CodeFont = new Font(ValidateCodeFont, ValidateCodeSize, FontStyle.Bold);
// 绘图用的刷子大小
Brush ImageBrush = new SolidBrush(Color.Red);
// 字体高度计算
int FontHeight = ( int )Math.Max(ImageHeight - ValidateCodeSize - 3 , 2 );
// 创建随机对象
Random rand = new Random();
// 开始随机安排字符的位置,并画到图像里
for ( int i = 0 ; i < TrueValidateCodeCount; i ++ )
{
// 生成随机点,决定字符串的开始输出范围
int [] FontCoordinate = new int [ 2 ];
FontCoordinate[ 0 ] = ( int )(i * ValidateCodeSize + rand.Next( 1 )) + 3 ;
FontCoordinate[ 1 ] = rand.Next(FontHeight);
Point FontDrawPoint = new Point(FontCoordinate[ 0 ], FontCoordinate[ 1 ]);
// 消除锯齿操作
if (FontTextRenderingHint)
ImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;
else
ImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
// 格式化刷子属性-用指定的刷子、颜色等在指定的范围内画图
ImageGraphics.DrawString(CodeCharArray[i].ToString(), CodeFont, ImageBrush, FontDrawPoint);
}
ImageGraphics.Dispose();
}
// 处理生成的BMP
private void DisposeImageBmp( ref Bitmap ImageFrame)
{
// 创建绘图对象
Graphics ImageGraphics = Graphics.FromImage(ImageFrame);
// 创建铅笔对象
Pen ImagePen = new Pen(Color.Red, 1 );
// 创建随机对象
Random rand = new Random();
// 创建随机点
Point[] RandPoint = new Point[ 2 ];
// 随机画线
for ( int i = 0 ; i < 15 ; i ++ )
{
RandPoint[ 0 ] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));
RandPoint[ 1 ] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));
ImageGraphics.DrawLine(ImagePen, RandPoint[ 0 ], RandPoint[ 1 ]);
}
ImageGraphics.Dispose();
}
// 创建GIF动画
private void CreateImageGif()
{
Bitmap ImageFrame;
Kissogram.Drawing.Gif.AnimatedGifEncoder GifPic = new Kissogram.Drawing.Gif.AnimatedGifEncoder();
MemoryStream BmpMemory = new MemoryStream();
GifPic.Start();
// 确保视觉残留
GifPic.SetDelay( 5 );
// -1:no repeat,0:always repeat
GifPic.SetRepeat( 0 );
for ( int i = 0 ; i < 20 ; i ++ )
{
// 创建一帧的图像
CreateImageBmp( out ImageFrame);
// 生成随机线条
DisposeImageBmp( ref ImageFrame);
// 输出绘图,将图像保存到指定的流
ImageFrame.Save(BmpMemory, System.Drawing.Imaging.ImageFormat.Png);
GifPic.AddFrame(Image.FromStream(BmpMemory));
BmpMemory = new MemoryStream();
}
GifPic.OutPut( ref BmpMemory);
HttpContext.Current.Response.ClearContent();
// 配置输出类型
HttpContext.Current.Response.ContentType = " image/Gif " ;
// 输出内容
HttpContext.Current.Response.BinaryWrite(BmpMemory.ToArray());
BmpMemory.Close();
BmpMemory.Dispose();
}
// 输出验证码
public void OutPutValidate( string ValidateCodeSession)
{
CreateValidate();
CreateImageGif();
// 把生成的验证码输入到SESSION
HttpContext.Current.Session[ValidateCodeSession] = ValidateCode;
}
}
}