如何C#程序进行验证码识别


现在用c#做程序越来越流行了,很多人都将它作为了自己的第一编程语言,因为它的方便快速的开发能力得到了不少人的青睐。使用C#进行验证码的识别有许多种方法,

下面是一段C#写成的验证码识别程序,里面用到了一些技巧,其实做过的人都知道,不太清楚的看一下代码,注释都给出来了,很好理解的。

 

 using System; 

   using System.Collections.Generic; 

   using System.Linq; 

   using System.Text; 

   using System.Drawing; 

   using System.IO; 

   using System.Configuration; 

     

   namespace ConsoleApplication4 

   { 

       /// <summary> 

       /// 根据样本做验证码破解 

       ///  

       /// 需要在.config文件中的appSettings配置节中添加key为sampleOcr.sampleDir value设置为样本图片所在路径 

       /// 验证码:https://investorservice.cfmmc.com/https://investorservice.cfmmc.com/veriCode.do?t=1335521167762&ip=202.99.16.22 

       ///   

       /// outofmemory.cn 20120427 

       /// 100个样例准确数为88个,错误主要发生在389这三个字符的混淆上 

       /// </summary> 

       public abstract class SampleOcr 

       { 

           /// <summary> 

           /// 灰度中间值 

           /// </summary> 

           static int MiddleGrayValue =200; 

     

           /// <summary> 

           /// 分割图片的差异容忍度 

           /// </summary> 

           static int ColorToleranceForSplit = 30; 

     

           /// <summary> 

           /// 样本字典 

           /// </summary> 

           static Dictionary<string, Bitmap> _samples; 

     

           /// <summary> 

           /// 破解验证码 

           /// </summary> 

           /// <param name="bm">验证码图片</param> 

           /// <returns>验证码文本</returns> 

           public static string Ocr(Bitmap bm) 

           { 

                //做灰度处理 

                GrayByPixels(bm); 

     

                bm =RemoveVerticalSpaceRegion(bm); 

     

                Bitmap[] splitBms =SplitBitmaps(bm); 

      

                char[] result = newchar[splitBms.Length]; 

                for (int i = 0; i <splitBms.Length; i++) 

                { 

                    result[i] =OcrChar(splitBms[i]); 

                    splitBms[i].Dispose(); 

               } 

                return new string(result); 

           } 

     

           /// <summary> 

           /// 分割图片 

           /// </summary> 

           /// <param name="bm">图片</param> 

           /// <returns>分割后的图片对象</returns> 

           static Bitmap[] SplitBitmaps(Bitmap bm) 

           { 

                //找出垂直分割线 

                List<int> removeXs = newList<int>(); 

                for (int x = 0; x <bm.Width; x++) 

                { 

                    bool hasDiffPoint =false; 

                    Color color =Color.White; 

                    for (int y = 0; y <bm.Height; y++) 

                    { 

                        if (y == 0) 

                        { 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值