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#程序设计有所帮助。