C#.Net2.0 完美随机验证码 0.10版本

本文介绍了一个随机验证码生成系统,能够生成包含字母和数字的验证码,并通过旋转字体的方式增加识别难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 花了两晚上的时间,昨天花2小时搞定生成普通的验证码

 

今天晚上花4个小时左右的时间来旋转字体和显示正确上了。

打算下一版加上随机噪点。好了,要睡了!哈哈哈哈~~~


using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  System.Drawing;


namespace  Test
{
        
///  <summary>
        
///  完美随机验证码  0.10  
        
///  Author                          :              zhouyu   http://max.cszi.com
        
///  Verion                          :              0.10
        
///  Update                        :              2007-10-9
        
///  Description            :              随机生成设定验证码,并随机旋转一定角度
        
///  </summary>

        public  partial  class  ValidateCode  :  System.Web.UI.Page
        
{

                
protected  void  Page_Load(object  sender,  EventArgs  e)
                
{
                        
string  randomcode  =  this.CreateRandomCode(4);
                        Session[
"ValidateCode"]  =  randomcode;
                        
//ViewState["ValidateCode"]  =  randomcode;
                        this.CreateImage(randomcode);
                }


                
///  <summary>
                
///  生成随机码
                
///  </summary>
                
///  <param  name="length">随机码个数</param>
                
///  <returns></returns>

                private  string  CreateRandomCode(int  length)
                
{
                        
int  rand;
                        
char  code;
                        
string  randomcode  =  String.Empty;

                        
//生成一定长度的验证码
                        System.Random  random  =  new  Random();
                        
for  (int  i  =  0;  i  <  length;  i++)
                        
{
                                rand  
=  random.Next();

                                
if  (rand  %  3  ==  0)
                                
{  code  =  (char)('A'  +  (char)(rand  %  26));  }
                                
else
                                
{  code  =  (char)('0'  +  (char)(rand  %  10));  }

                                randomcode  
+=  code.ToString();
                        }

                        
return  randomcode;
                }



                
///  <summary>
                
///  创建随机码图片
                
///  </summary>
                
///  <param  name="randomcode">随机码</param>

                private  void  CreateImage(string  randomcode)
                
{
                        
int  randAngle  =  45;            //随机转动角度
                        int  mapwidth  =  (int)(randomcode.Length  *  22);
                        Bitmap  map  
=  new  Bitmap(mapwidth,  28);                            //创建图片背景
                        Graphics  graph  =  Graphics.FromImage(map);
                        
//Font  fontstyle  =  new  Font("Arial",  20,  FontStyle.Bold);            //字体样式
                        
//graph.FillRectangle(new  SolidBrush(Color.Black),  0,  0,  map.Width+1,  map.Height+1);          //填充一个有背景的矩形
                        graph.Clear(Color.AliceBlue);              //清除画面,填充背景
                        
//graph.DrawRectangle(new  Pen(Color.Black,  0),  0,  0,  map.Width  -  1,  map.Height  -  1);              //画一个边框
                        
//graph.SmoothingMode  =  System.Drawing.Drawing2D.SmoothingMode.AntiAlias;        //模式
                        

                        Random  rand  
=  new  Random();

                        
//背景噪点生成
                        
//Pen  blackPen  =  new  Pen(Color.Black,  0);
                        
//for  (int  i  =  0;  i  <  2000;  i++)
                        
//{
                        
//        int  x  =  rand.Next(0,  map.Width);
                        
//        int  y  =  rand.Next(0,  map.Height);
                        
//        graph.DrawRectangle(blackPen,  x,  y,    1,  1);

                        
//}

                        
//验证码旋转,防止机器识别
                        char[]  chars  =  randomcode.ToCharArray();            //拆散字符串成单字符数组

                        
//文字距中
                        StringFormat  format  =  new  StringFormat(StringFormatFlags.NoClip);
                        format.Alignment  
=  StringAlignment.Center;
                        format.LineAlignment  
=  StringAlignment.Center;

                        
for  (int  i  =  0;  i  <  chars.Length;  i++)
                        
{
                                Font  fontstyle  
=  new  Font("Arial",  rand.Next(20,22),  FontStyle.Regular);            //字体样式
                                Point  dot  =  new  Point(16,  16);
                                
//graph.DrawString(dot.X.ToString(),  fontstyle,  new  SolidBrush(Color.Black),  10,  150);                //测试X坐标显示间距的
                                float  angle  =  rand.Next(-randAngle,  randAngle);            //转动的度数

                                graph.TranslateTransform(dot.X,  dot.Y);          
//移动光标到指定位置
                                graph.RotateTransform(angle);                              
                                graph.DrawString(chars[i].ToString(),  fontstyle,  
new  SolidBrush(Color.Blue),    1  ,  1  ,  format  );
                                graph.RotateTransform(
-angle);                    //转回去
                                graph.TranslateTransform(2,  -dot.Y);          //移动光标到指定位置
                        }

                        
//graph.DrawString(randomcode,  fontstyle,  new  SolidBrush(Color.Blue),  2,  2);                    //标准随机码
                        
                        
//生成图片
                        System.IO.MemoryStream  ms  =  new  System.IO.MemoryStream();
                        map.Save(ms,  System.Drawing.Imaging.ImageFormat.Gif);
                        Response.ClearContent();
                        Response.ContentType  
=  "image/gif";
                        Response.BinaryWrite(ms.ToArray());
                        graph.Dispose();
                        map.Dispose();
                }




        }


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值