时间:2016-12-21来源:本站原创作者:佚名

目前,许多网站的会员登录时都要求输入验证码,尽管验证码的形式五花八门,但是所使用的原理基本是一样的,都是生成随机字符串,然后描绘成图片的形式输出。

验证码的生产主要分两部分:1是随机字符串的生成;2是生产验证码图片

1.随机字符串的生成:

随机字符串生成有很多方法,这里介绍一种利用字符数组生产随机串的方法

代码如图1所示,自定义自己的随机字符数组,然后使用随机函数随机抽取4个字符组成一个随机字符串

///summary///生成随机字符串////summary///returns/returnsprivatestringGenerateCheckCode(){//PageUtils.VerifyCode=checkCode.ToLower();//自定义自己验证码需要显示的字符//如果仅仅是数字和26个字母,您可以写一个循环遍历char[]myCodeChar={1,2,3,4,5,a,b,c,d,e,f};intnumber;charcode;stringcheckCode=string.Empty;//使用随机函数,产生一个随机数System.Randomrandom=newRandom();for(inti=0;i4;i++){number=random.Next(myCodeChar.Length);code=(char)(myCodeChar[number]);checkCode+=code.ToString();}Session[checkCode]=checkCode.ToLower();//把生成的验证码存入sessionreturncheckCode;}

图1

2生产验证码图片,其实就是用c#的Graphics把生成德随机串描绘到图片上,具体请看图2代码示意:

252627282

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

///summary///生成验证码图片,并输出////summary///paramname=checkCode/paramprivatevoidCreateCheckCodeImage(stringcheckCode){if(checkCode==null

checkCode.Trim()==String.Empty)return;Matrixm=newMatrix();//定义几何变换Bitmapcharbmp=newBitmap(90,30);//图片前景色,即生成背景透明的随机字符串图片//定义字体Font[]fonts={newFont(newFontFamily(TimesNewRoman),17,FontStyle.Regular),newFont(newFontFamily(Georgia),17,FontStyle.Regular),newFont(newFontFamily(Arial),17,FontStyle.Regular),newFont(newFontFamily(ComicSansMS),17,FontStyle.Regular)};//定义图片背景色System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length*22.5)),30);//开始描绘Graphicsg=Graphics.FromImage(image);g.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighSpeed;//定义背景色为白色g.Clear(Color.White);try{Randomrandom=newRandom();//生成随机生成器g.Clear(Color.White);//清空图片背景色for(inti=0;i2;i++)//画图片的背景噪音线,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.Black),x1,y1,x2,y2);}//开始描绘前景图Graphicscharg=Graphics.FromImage(charbmp);SolidBrushdrawBrush=newSolidBrush(Color.FromArgb(random.Next(),random.Next(),random.Next()));floatcharx=-18;//把随机字符串,逐个写入前景图for(inti=0;icheckCode.Length;i++){m.Reset();m.RotateAt(random.Next(31)-25,newPointF(random.Next(4)+7,random.Next(4)+7));charg.Clear(Color.Transparent);//定义前景图为透明charg.Transform=m;//定义前景色为黑色drawBrush.Color=Color.Black;charx=charx+20+random.Next(3);PointFdrawPoint=newPointF(charx,0.1F);charg.DrawString(checkCode[i].ToString(),fonts[random.Next(fonts.Length)],drawBrush,newPointF(0,0));//通过特定的几何变换,旋转或变形随机字符,写入前景图charg.ResetTransform();g.DrawImage(charbmp,drawPoint);}//画图片的前景噪音点for(inti=0;i25;i++){intx=random.Next(image.Width);inty=random.Next(image.Height);image.SetPixel(x,y,Color.FromArgb(random.Next()));}//画图片的边框线g.DrawRectangle(newPen(Color.Silver),0,0,image.Width-1,image.Height-1);//输出System.IO.MemoryStreamms=newSystem.IO.MemoryStream();image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);Response.ClearContent();Response.ContentType=image/Gif;Response.BinaryWrite(ms.ToArray());}finally{g.Dispose();image.Dispose();}}

然后调用此函数即可,原理比较简单,只不过是c#的绘图技巧而已···

转自:







































白癜风的治疗办法
北京的医院治疗白癜风

转载请注明原文网址:http://www.helimiaopu.com/jsyy/3907.html

------分隔线----------------------------