【www.bbyears.com--js教程】
代码如下word">using
System;
word">using
System.Web;
using
System.Drawing;
using
System.Security.Cryptography;
namespace
DotNet.Utilities
{
///
/// 验证码类
///
public
class
Rand
{
#region 生成随机数字
///
/// 生成随机数字
///
///生成长度
public
static
string
Number(
int
Length)
{
return
Number(Length,
false
);
}
///
/// 生成随机数字
///
///生成长度
///是否要在生成前将当前线程阻止以避免重复
public
static
string
Number(
int
Length,
bool
Sleep)
{
if
(Sleep) System.Threading.Thread.Sleep(3);
string
result =
""
;
System.Random random =
new
Random();
for
(
int
i = 0; i < Length; i++)
{
result += random.Next(10).ToString();
}
return
result;
}
#endregion
#region 生成随机字母与数字
///
/// 生成随机字母与数字
///
///生成长度
public
static
string
Str(
int
Length)
{
return
Str(Length,
false
);
}
///
/// 生成随机字母与数字
///
///生成长度
///是否要在生成前将当前线程阻止以避免重复
public
static
string
Str(
int
Length,
bool
Sleep)
{
if
(Sleep) System.Threading.Thread.Sleep(3);
char
[] Pattern =
new
char
[] {
Ɔ'
,
Ƈ'
,
ƈ'
,
Ɖ'
,
Ɗ'
,
Ƌ'
,
ƌ'
,
ƍ'
,
Ǝ'
,
Ə'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
};
string
result =
""
;
int
n = Pattern.Length;
System.Random random =
new
Random(~
unchecked
((
int
)DateTime.Now.Ticks));
for
(
int
i = 0; i < Length; i++)
{
int
rnd = random.Next(0, n);
result += Pattern[rnd];
}
return
result;
}
#endregion
#region 生成随机纯字母随机数
///
/// 生成随机纯字母随机数
///
///生成长度
public
static
string
Str_char(
int
Length)
{
return
Str_char(Length,
false
);
}
///
/// 生成随机纯字母随机数
///
///生成长度
///是否要在生成前将当前线程阻止以避免重复
public
static
string
Str_char(
int
Length,
bool
Sleep)
{
if
(Sleep) System.Threading.Thread.Sleep(3);
char
[] Pattern =
new
char
[] {
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
};
string
result =
""
;
int
n = Pattern.Length;
System.Random random =
new
Random(~
unchecked
((
int
)DateTime.Now.Ticks));
for
(
int
i = 0; i < Length; i++)
{
int
rnd = random.Next(0, n);
result += Pattern[rnd];
}
return
result;
}
#endregion
}
///
/// 验证图片类
///
public
class
YZMHelper
{
#region 私有字段
private
string
text;
private
Bitmap image;
private
int
letterCount = 4;
//验证码位数
private
int
letterWidth = 16;
//单个字体的宽度范围
private
int
letterHeight = 20;
//单个字体的高度范围
private
static
byte
[] randb =
new
byte
[4];
private
static
RNGCryptoServiceProvider rand =
new
RNGCryptoServiceProvider();
private
Font[] fonts =
{
new
Font(
new
FontFamily(
"Times New Roman"
),10 +Next(1),System.Drawing.FontStyle.Regular),
new
Font(
new
FontFamily(
"Georgia"
), 10 + Next(1),System.Drawing.FontStyle.Regular),
new
Font(
new
FontFamily(
"Arial"
), 10 + Next(1),System.Drawing.FontStyle.Regular),
new
Font(
new
FontFamily(
"Comic Sans MS"
), 10 + Next(1),System.Drawing.FontStyle.Regular)
};
#endregion
#region 公有属性
///
/// 验证码
///
public
string
Text
{
get
{
return
this
.text; }
}
///
/// 验证码图片
///
public
Bitmap Image
{
get
{
return
this
.image; }
}
#endregion
#region 构造函数
public
YZMHelper()
{
HttpContext.Current.Response.Expires = 0;
HttpContext.Current.Response.Buffer =
true
;
HttpContext.Current.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
HttpContext.Current.Response.AddHeader(
"pragma"
,
"no-cache"
);
HttpContext.Current.Response.CacheControl =
"no-cache"
;
this
.text = Rand.Number(4);
CreateImage();
}
#endregion
#region 私有方法
///
/// 获得下一个随机数
///
///最大值
private
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;
}
///
/// 获得下一个随机数
///
///最小值
///最大值
private
static
int
Next(
int
min,
int
max)
{
int
value = Next(max - min) + min;
return
value;
}
#endregion
#region 公共方法
///
/// 绘制验证码
///
public
void
CreateImage()
{
int
int_ImageWidth =
this
.text.Length * letterWidth;
Bitmap image =
new
Bitmap(int_ImageWidth, letterHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
for
(
int
i = 0; i < 2; i++)
{
int
x1 = Next(image.Width - 1);
int
x2 = Next(image.Width - 1);
int
y1 = Next(image.Height - 1);
int
y2 = Next(image.Height - 1);
g.DrawLine(
new
Pen(Color.Silver), x1, y1, x2, y2);
}
int
_x = -12, _y = 0;
for
(
int
int_index = 0; int_index <
this
.text.Length; int_index++)
{
_x += Next(12, 16);
_y = Next(-2, 2);
string
str_char =
this
.text.Substring(int_index, 1);
str_char = Next(1) == 1 ? str_char.ToLower() : str_char.ToUpper();
Brush newBrush =
new
SolidBrush(GetRandomColor());
Point thePos =
new
Point(_x, _y);
g.DrawString(str_char, fonts[Next(fonts.Length - 1)], newBrush, thePos);
}
for
(
int
i = 0; i < 10; i++)
{
int
x = Next(image.Width - 1);
int
y = Next(image.Height - 1);
image.SetPixel(x, y, Color.FromArgb(Next(0, 255), Next(0, 255), Next(0, 255)));
}
image = TwistImage(image,
true
, Next(1, 3), Next(4, 6));
g.DrawRectangle(
new
Pen(Color.LightGray, 1), 0, 0, int_ImageWidth - 1, (letterHeight - 1));
this
.image = image;
}
///
/// 字体随机颜色
///
public
Color GetRandomColor()
{
Random RandomNum_First =
new
Random((
int
)DateTime.Now.Ticks);
System.Threading.Thread.Sleep(RandomNum_First.Next(50));
Random RandomNum_Sencond =
new
Random((
int
)DateTime.Now.Ticks);
int
int_Red = RandomNum_First.Next(180);
int
int_Green = RandomNum_Sencond.Next(180);
int
int_Blue = (int_Red + int_Green > 300) ? 0 : 400 - int_Red - int_Green;
int_Blue = (int_Blue > 255) ? 255 : int_Blue;
return
Color.FromArgb(int_Red, int_Green, int_Blue);
}
///
/// 正弦曲线Wave扭曲图片
///
///图片路径
///如果扭曲则选择为True
///波形的幅度倍数,越大扭曲的程度越高,一般为3
///波形的起始相位,取值区间[0-2*PI)
public
System.Drawing.Bitmap TwistImage(Bitmap srcBmp,
bool
bXDir,
double
dMultValue,
double
dPhase)
{
double
PI = 6.283185307179586476925286766559;
Bitmap destBmp =
new
Bitmap(srcBmp.Width, srcBmp.Height);
Graphics graph = Graphics.FromImage(destBmp);
graph.FillRectangle(
new
SolidBrush(Color.White), 0, 0, destBmp.Width, destBmp.Height);
graph.Dispose();
double
dBaseAxisLen = bXDir ? (
double
)destBmp.Height : (
double
)destBmp.Width;
for
(
int
i = 0; i < destBmp.Width; i++)
{
for
(
int
j = 0; j < destBmp.Height; j++)
{
double
dx = 0;
dx = bXDir ? (PI * (
double
)j) / dBaseAxisLen : (PI * (
double
)i) / dBaseAxisLen;
dx += dPhase;
double
dy = Math.Sin(dx);
int
nOldX = 0, nOldY = 0;
nOldX = bXDir ? i + (
int
)(dy * dMultValue) : i;
nOldY = bXDir ? j : j + (
int
)(dy * dMultValue);
Color color = srcBmp.GetPixel(i, j);
if
(nOldX >= 0 && nOldX < destBmp.Width
&& nOldY >= 0 && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
}
srcBmp.Dispose();
return
destBmp;
}
#endregion
}
}