WinForm生成验证码图片的方法
本文实例讲述了WinForm生成验证码图片的方法。分享给大家供大家参考,具体如下:
1、创建ValidCode类:
publicclassValidCode
{
#regionPrivateFields
privateconstdoublePI=3.1415926535897932384626433832795;
privateconstdoublePI2=6.283185307179586476925286766559;
//privatereadonlyint_wordsLen=4;
privateint_len;
privateCodeType_codetype;
privatereadonlySingle_jianju=(float)18.0;
privatereadonlySingle_height=(float)24.0;
privatestring_checkCode;
#endregion
#regionPublicProperty
publicstringCheckCode
{
get
{
return_checkCode;
}
}
#endregion
#regionConstructors
///<summary>
///publicconstructors
///</summary>
///<paramname="len">验证码长度</param>
///<paramname="ctype">验证码类型:字母、数字、字母+数字</param>
publicValidCode(intlen,CodeTypectype)
{
this._len=len;
this._codetype=ctype;
}
#endregion
#regionPublicField
publicenumCodeType{Words,Numbers,Characters,Alphas}
#endregion
#regionPrivateMethods
privatestringGenerateNumbers()
{
stringstrOut="";
System.Randomrandom=newRandom();
for(inti=0;i<_len;i++)
{
stringnum=Convert.ToString(random.Next(10000)%10);
strOut+=num;
}
returnstrOut.Trim();
}
privatestringGenerateCharacters()
{
stringstrOut="";
System.Randomrandom=newRandom();
for(inti=0;i<_len;i++)
{
stringnum=Convert.ToString((char)(65+random.Next(10000)%26));
strOut+=num;
}
returnstrOut.Trim();
}
//
privatestringGenerateAlphas()
{
stringstrOut="";
stringnum="";
System.Randomrandom=newRandom();
for(inti=0;i<_len;i++)
{
if(random.Next(500)%2==0)
{
num=Convert.ToString(random.Next(10000)%10);
}
else
{
num=Convert.ToString((char)(65+random.Next(10000)%26));
}
strOut+=num;
}
returnstrOut.Trim();
}
privateSystem.Drawing.BitmapTwistImage(BitmapsrcBmp,boolbXDir,doubledMultValue,doubledPhase)
{
System.Drawing.BitmapdestBmp=newBitmap(srcBmp.Width,srcBmp.Height);
//将位图背景填充为白色
System.Drawing.Graphicsgraph=System.Drawing.Graphics.FromImage(destBmp);
graph.FillRectangle(newSolidBrush(System.Drawing.Color.White),0,0,destBmp.Width,destBmp.Height);
graph.Dispose();
doubledBaseAxisLen=bXDir?(double)destBmp.Height:(double)destBmp.Width;
for(inti=0;i<destBmp.Width;i++)
{
for(intj=0;j<destBmp.Height;j++)
{
doubledx=0;
dx=bXDir?(PI2*(double)j)/dBaseAxisLen:(PI2*(double)i)/dBaseAxisLen;
dx+=dPhase;
doubledy=Math.Sin(dx);
//取得当前点的颜色
intnOldX=0,nOldY=0;
nOldX=bXDir?i+(int)(dy*dMultValue):i;
nOldY=bXDir?j:j+(int)(dy*dMultValue);
System.Drawing.Colorcolor=srcBmp.GetPixel(i,j);
if(nOldX>=0&&nOldX<destBmp.Width
&&nOldY>=0&&nOldY<destBmp.Height)
{
destBmp.SetPixel(nOldX,nOldY,color);
}
}
}
returndestBmp;
}
#endregion
#regionPublicMethods
publicStreamCreateCheckCodeImage()
{
stringcheckCode;
switch(_codetype)
{
caseCodeType.Alphas:
checkCode=GenerateAlphas();
break;
caseCodeType.Numbers:
checkCode=GenerateNumbers();
break;
caseCodeType.Characters:
checkCode=GenerateCharacters();
break;
default:
checkCode=GenerateAlphas();
break;
}
this._checkCode=checkCode;
MemoryStreamms=null;
//
if(checkCode==null||checkCode.Trim()==String.Empty)
returnnull;
Bitmapimage=newSystem.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length*_jianju)),(int)_height);
Graphicsg=Graphics.FromImage(image);
try
{
Randomrandom=newRandom();
g.Clear(Color.White);
//画图片的背景噪音线
for(inti=0;i<18;i++)
{
intx1=random.Next(image.Width);
intx2=random.Next(image.Width);
inty1=random.Next(image.Height);
inty2=random.Next(image.Height);
g.DrawLine(newPen(Color.FromArgb(random.Next()),1),x1,y1,x2,y2);
}
Fontfont=newSystem.Drawing.Font("TimesNewRoman",14,System.Drawing.FontStyle.Bold);
LinearGradientBrushbrush=newLinearGradientBrush(newRectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true);
if(_codetype!=CodeType.Words)
{
for(inti=0;i<checkCode.Length;i++)
{
g.DrawString(checkCode.Substring(i,1),font,brush,2+i*_jianju,1);
}
}
else
{
g.DrawString(checkCode,font,brush,2,2);
}
//画图片的前景噪音点
for(inti=0;i<150;i++)
{
intx=random.Next(image.Width);
inty=random.Next(image.Height);
image.SetPixel(x,y,Color.FromArgb(random.Next()));
}
//画图片的波形滤镜效果
if(_codetype!=CodeType.Words)
{
image=TwistImage(image,true,3,1);
}
//画图片的边框线
g.DrawRectangle(newPen(Color.Silver),0,0,image.Width-1,image.Height-1);
ms=newSystem.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
}
finally
{
g.Dispose();
image.Dispose();
}
returnms;
}
#endregion
}
2、产生验证码图片代码:
//参数一:产生几个字符的验证码图片参数二:验证码的形式(数字、字母、数字字母混合都有) ValidCodevalidCode=newValidCode(5,ValidCode.CodeType.Alphas); this.pictureBox2.Image=Bitmap.FromStream(validCode.CreateCheckCodeImage());
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。