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

 花了两晚上的时间,昨天花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();
                }




        }


}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用过程注意事项: 1.调用DLL识别库识别,多线程下不需要加许可证,支持并发识别. 2.调用DLL识别,识别参数设置命令SetWmOption必须与你弄字库时候的设置参数一样,不然会导致识别率下降具体参数说明,请看调用例子里的[我的函数.txt]文档有对应参数说明. 3.如果遇见本工具无法识别的验证码,可以找群主(用神经网络识别)定制,价格便宜公道. [2017-07-27] 完美验证码识别系统V3.2 1.增加DLL识别返回方式2和3具体看我的函数.txt里说明,主要是增加一个可以返回识别后的总体信任度.这个值你可以给它个阀值,比如说如果总体信任度小于60,那么你就不提交服务器,直接重新获取图片识别,直到总体信任度大于60你才提交给服务器,这个阀值具体多少,自己可以先测试. 2.修复导出字库没有导出完,直接关闭窗口崩溃问题 3.添加批量下载后定位到批量下载文件夹 4.增加可以使用验证码长度进行过滤,增加可以使用总体信任度进行过滤.(这两个功能可以快速的制作字库,比如说你验证码是4位的,你可以设置验证码小于4,大于4那这张图片肯定是识别错误的,那么软件就会把这张图片保存下来,同理可以使用总体信任度进行此保存) [2017-07-20] 完美验证码识别系统V3.1 1.修复数组下标越界问题 2.字库列表添加可以多选然后右键批量删除选中项 [2017-07-13] 完美验证码识别系统V3.0 1.修复导出字库,重复导出不会覆盖原来的BUG,导出的图片会累加上去(注意,以前导出的字模导入新版中会出错,新版字模导出格式为a_md5.bmp 请自行写个软件修改文件名,然后再导入) 2.修复添加字库空格都可以添加进去 3.修复崩溃问题.(崩溃应该绝大多数都是此原因造成的.) 4.其它一些调整. [2017-06-25] 完美验证码识别系统V2.6 1.解决输入焦点问题. 2.批量下载增加可以过滤掉宽度范围,面积范围,高度范围,黑色数范围,可以去掉没有用的干扰图片. 3.其它的一些细节调整 [2017-06-07] 完美验证码识别系统V2.5 1.修复去除干扰滤镜在没有先二值化图片都可以使用. 2.尝试解决添加字库崩溃问题(代码较多,找到1处问题.不知道还有没有其他问题) 3.编辑字库页面增加个选中框[添加字库后自动下载图片],使用批量下载图片,可以快速添加字库 4.使用截图工具,截取图片后,会自动切换到划线工具. [2017-05-17] 完美验证码识别系统V2.3 1.修复设置滤镜默认都有选择项. 2.修复当使用本地图像时,没有新建项目都可以编辑的问题. 3.修复黑白处理滤镜在没有先二值化图片都可以使用. 4.修复处理很多逻辑错误会导致程序崩溃. 5.增加字库列表添加右键删除当前选中的字库 6.增加禁止重复运行,由于重复运行会导致字库添加失败,和读取不到已经做过的字库. 7.增加快捷键"自动分割(Alt+R)" ,"手动分割(Alt+T)" 8.编辑页面增加个批量下载按钮,可以实现批量下载并自动分割图片功能(批量下载的图片保存在当前项目文件夹下的"批量下载"文件夹中) 9.主窗口增加一个选择框_图像已处理不使用滤镜,由于批量下载后图片都是已经使用过滤镜了,处理批量下载的图片这里必须得勾选上,不然会重复运用滤镜 [2017-05-07] 完美验证码识别系统V2.2 1.新增分辨率1024*768布局 2.修改注册热键方式为本进程方式(原为全局热键,感谢群友XGSoft提供源代码) [2017-05-06] 完美验证码识别系统V2.1(要求屏幕分辨率最低1440*900) 1.去掉窗口最大化,去掉自动调整窗口大小代码,修复部分控件显示不全 2.增加检测图像是否二值化,没二值化的图片不允许编辑 3.尝试解决添加字库崩溃的问题(不确定问题出在哪!!) 4.解决滤波数组越界问题.
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值