首页 > 代码库 > 验证码常用函数备忘

验证码常用函数备忘

颜色聚类

技术分享
  1  public static class KmeansColor  2     {  3         /*  4   * 聚类函数主体。  5   * 针对一维 double 数组。指定聚类数目 k。  6   * 将数据聚成 k 类。  7   */  8         public static Color[][] cluster(Color[] p, int k)  9         { 10             int intRunCount = 0; 11         start: 12             intRunCount++; 13             // 存放聚类旧的聚类中心 14             Color[] c = new Color[k]; 15             // 存放新计算的聚类中心 16             Color[] nc = new Color[k]; 17             // 存放放回结果 18             Color[][] g; 19             // 初始化聚类中心 20             // 经典方法是随机选取 k 个 21             // 本例中采用前 k 个作为聚类中心 22             // 聚类中心的选取不影响最终结果 23             Random r = new Random(); 24  25             int intValue = http://www.mamicode.com/-16777216 / k; 26             for (int i = 0; i < k; i++) 27             { 28                 c[i] = Color.FromArgb(r.Next(1, 255), r.Next(1, 255), r.Next(1, 255)); 29             } 30             // 循环聚类,更新聚类中心 31             // 到聚类中心不变为止 32             while (true) 33             { 34                 // 根据聚类中心将元素分类 35                 g = group(p, c); 36                 // 计算分类后的聚类中心 37                 for (int i = 0; i < g.Length; i++) 38                 { 39                     nc[i] = center(g[i]); 40                 } 41                 // 如果聚类中心不同 42                 if (!equal(nc, c)) 43                 { 44                     // 为下一次聚类准备 45                     c = nc; 46                     nc = new Color[k]; 47                 } 48                 else // 聚类结束 49                 { 50                     foreach (var item in g) 51                     { 52                         if (intRunCount < 10000 && item.Length <= 50) 53                         { 54                             goto start; 55                         } 56                     } 57                     break; 58                 } 59             } 60             // 返回聚类结果 61             return g; 62         } 63         /* 64          * 聚类中心函数 65          * 简单的一维聚类返回其算数平均值 66          * 可扩展 67          */ 68         public static Color center(Color[] p) 69         { 70             if (p.Length <= 0) 71             { 72                 Random r = new Random(); 73                 return Color.FromArgb(r.Next(1, 255), r.Next(1, 255), r.Next(1, 255)); 74             } 75             int intSumR = 0, intSumG = 0, intSumB = 0; 76             foreach (var item in p) 77             { 78                 intSumR += item.R; 79                 intSumG += item.G; 80                 intSumB += item.B; 81             } 82             int intLength = p.Length; 83             return Color.FromArgb(intSumR / intLength, intSumG / intLength, intSumB / intLength); 84         } 85         /* 86          * 给定 double 型数组 p 和聚类中心 c。 87          * 根据 c 将 p 中元素聚类。返回二维数组。 88          * 存放各组元素。 89          */ 90         public static Color[][] group(Color[] p, Color[] c) 91         { 92             // 中间变量,用来分组标记 93             int[] gi = new int[p.Length]; 94             // 考察每一个元素 pi 同聚类中心 cj 的距离 95             // pi 与 cj 的距离最小则归为 j 类 96             for (int i = 0; i < p.Length; i++) 97             { 98                 // 存放距离 99                 double[] d = new double[c.Length];100                 // 计算到每个聚类中心的距离101                 for (int j = 0; j < c.Length; j++)102                 {103                     d[j] = distance(p[i], c[j]);104                 }105                 // 找出最小距离106                 int ci = min(d);107                 // 标记属于哪一组108                 gi[i] = ci;109             }110             // 存放分组结果111             Color[][] g = new Color[c.Length][];112             // 遍历每个聚类中心,分组113             for (int i = 0; i < c.Length; i++)114             {115                 // 中间变量,记录聚类后每一组的大小116                 int s = 0;117                 // 计算每一组的长度118                 for (int j = 0; j < gi.Length; j++)119                     if (gi[j] == i)120                         s++;121                 // 存储每一组的成员122                 g[i] = new Color[s];123                 s = 0;124                 // 根据分组标记将各元素归位125                 for (int j = 0; j < gi.Length; j++)126                     if (gi[j] == i)127                     {128                         g[i][s] = p[j];129                         s++;130                     }131             }132             // 返回分组结果133             return g;134         }135 136         /*137          * 计算两个点之间的距离, 这里采用最简单得一维欧氏距离, 可扩展。138          */139         public static double distance(Color x, Color y)140         {141 142             return Math.Sqrt(Math.Pow(x.R - y.R, 2) + Math.Pow(x.G - y.G, 2) + Math.Pow(x.B - y.B, 2));143             // return Math.Abs(x.R - y.R) + Math.Abs(x.G - y.G) + Math.Abs(x.B - y.B);144         }145 146         /*147          * 返回给定 double 数组各元素之和。148          */149         public static double sum(double[] p)150         {151             double sum = 0.0;152             for (int i = 0; i < p.Length; i++)153                 sum += p[i];154             return sum;155         }156 157         /*158          * 给定 double 类型数组,返回最小值得下标。159          */160         public static int min(double[] p)161         {162             int i = 0;163             double m = p[0];164             for (int j = 1; j < p.Length; j++)165             {166                 if (p[j] < m)167                 {168                     i = j;169                     m = p[j];170                 }171             }172             return i;173         }174 175         /*176          * 判断两个 double 数组是否相等。 长度一样且对应位置值相同返回真。177          */178         public static bool equal(Color[] a, Color[] b)179         {180             if (a.Length != b.Length)181                 return false;182             else183             {184                 for (int i = 0; i < a.Length; i++)185                 {186                     if (a[i].Name != b[i].Name)187                         return false;188                 }189             }190             return true;191         }192     }
View Code

 

常用函数

技术分享
   1 using System;   2 using System.Collections.Generic;   3 using System.Linq;   4 using System.Text;   5 using System.Drawing;   6 using AForge.Imaging.Filters;   7 using AForge.Imaging;   8 using AForge.Math.Geometry;   9 using System.Drawing.Imaging;  10 using AForge;  11 using System.IO;  12 using System.Text.RegularExpressions;  13 using AForge.Math;  14   15 namespace RecogniseCode  16 {  17     /*  18      * 配置文件描述:  19      * 0:去边框 1:颜色去除;2:灰度;3:二值化;4:去噪;5:标记;6:投影检测  20      * -----------------------  21      * 01:边框宽度 上,右,下,左  22      * -----------------------  23      * 11:目标颜色,|分割,12:阈值,13:替换颜色  24      * -----------------------  25      * 21:灰度参数  26      * -----------------------  27      * 31:二值化参数  28      * -----------------------  29      * 41:去噪参数  30      * -----------------------  31      * 51:标记最小大小  32      * 52:是否检查宽度合并  33      * 53:检查宽度合并最大宽度  34      * 54:是否左右旋转以找到最小宽度图片  35      * -----------------------  36      * 61:是否谷底检查  37      * 62:谷底检查最大高度  38      * 63:是否超宽检查  39      * 64:超宽检查最大宽度  40      */  41     public class Code2Text  42     {  43         private CodeType m_codeType;  44         private string m_strModePath;  45         private XMLSourceHelp m_xml;  46         /// <summary>  47         /// 功能描述:构造函数  48         /// 作  者:huangzh  49         /// 创建日期:2016-09-01 15:21:27  50         /// 任务编号:  51         /// </summary>  52         /// <param name="codeType">验证码类型</param>  53         /// <param name="strModePath">验证码识别模板文件夹路径</param>  54         public Code2Text(CodeType codeType, string strModePath)  55         {  56             m_codeType = codeType;  57             m_strModePath = strModePath;  58             if (!Directory.Exists(strModePath))  59             {  60                 throw new Exception("验证码识别模板文件夹路径不存在");  61             }  62             string strConfigPath = Path.Combine(m_strModePath, "config.xml");  63             if (!File.Exists(strConfigPath))  64                 throw new Exception("识别模板配置文件不存在");  65             m_xml = new XMLSourceHelp(strConfigPath);  66         }  67   68         /// <summary>  69         /// 功能描述:识别验证码结果  70         /// 作  者:huangzh  71         /// 创建日期:2016-09-01 16:25:45  72         /// 任务编号:  73         /// </summary>  74         /// <param name="bit">bit</param>  75         /// <returns>返回值</returns>  76         public string GetCodeText(Bitmap bit)  77         {  78             switch (m_codeType)  79             {  80                 case CodeType.Tianjin:  81                     return GetTianJin(bit);  82                 case CodeType.LiaoNing:  83                     return GetLiaoNing(bit);  84                 case CodeType.JiangSu:  85                     return GetJiangSu(bit);  86                 case CodeType.JiangXi:  87                     return GetJiangXi(bit);  88                 case CodeType.ChongQing:  89                     return GetChongQing(bit);  90                 case CodeType.NingXia:  91                     return GetNingXia(bit);  92                 case CodeType.XinJiang:  93                     return GetXinJiang(bit);  94                 case CodeType.TianYanCha:  95                     return GetTianYanCha(bit);  96                 case CodeType.BeiJing:  97                     return GetBeiJing(bit);  98                 case CodeType.QingHai:  99                     return GetQingHai(bit); 100                 case CodeType.ShanXi: 101                     return GetShanXi(bit); 102                 case CodeType.HeiLongJiang: 103                     return GetHeiLongJiang(bit); 104                 default: return ""; 105             } 106         } 107  108         #region 具体验证码识别 109         /// <summary> 110         /// 功能描述:获取天津验证码结果 111         /// 作  者:huangzh 112         /// 创建日期:2016-09-01 16:26:00 113         /// 任务编号: 114         /// </summary> 115         /// <param name="bitImage">bitImage</param> 116         /// <returns>识别结果,如果为空,则为识别失败</returns> 117         private string GetTianJin(Bitmap bitImage) 118         { 119             //颜色去除 120             bitImage = ClearColor(bitImage); 121  122             //灰度   123             bitImage = HuiDu(bitImage); 124  125             //二值化 126             bitImage = ErZhi(bitImage); 127  128             //反转 129             bitImage = ColorFanZhuan(bitImage); 130  131             //去噪            132             bitImage = QuZao(bitImage); 133  134             //标记识别             135             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 136             string strNum1 = string.Empty; 137             string strYun = string.Empty; 138             string strNum2 = string.Empty; 139             foreach (string strItem in lstChar) 140             { 141                 if (Regex.IsMatch(strItem, @"\d+")) 142                 { 143                     if (string.IsNullOrEmpty(strYun)) 144                     { 145                         strNum1 += strItem; 146                     } 147                     else 148                     { 149                         strNum2 += strItem; 150                     } 151                 } 152                 else if (Regex.IsMatch(strItem, @"\+|\-|\#")) 153                 { 154                     if (string.IsNullOrEmpty(strYun)) 155                     { 156                         strYun = strItem; 157                     } 158                 } 159                 else if (Regex.IsMatch(strItem, @"\=")) 160                 { 161  162                 } 163             } 164  165             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 166             { 167                 int intNum1 = int.Parse(strNum1); 168                 int intNum2 = int.Parse(strNum2); 169                 switch (strYun) 170                 { 171                     case "+": return (intNum1 + intNum2).ToString(); 172                     case "-": return (intNum1 - intNum2).ToString(); 173                     case "#": return (intNum1 * intNum2).ToString(); 174                     default: return string.Empty; 175                 } 176             } 177             return string.Empty; 178         } 179  180         /// <summary> 181         /// 功能描述:获取辽宁验证码结果 182         /// 作  者:huangzh 183         /// 创建日期:2016-09-02 09:30:56 184         /// 任务编号: 185         /// </summary> 186         /// <param name="bitImage">bitImage</param> 187         /// <returns>返回值</returns> 188         private string GetLiaoNing(Bitmap bitImage) 189         { 190             //灰度   191             bitImage = HuiDu(bitImage); 192  193             //二值化 194             bitImage = ErZhi(bitImage); 195  196             //去噪            197             bitImage = QuZao(bitImage); 198  199             //标记识别             200             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 201  202             return string.Join("", lstChar); 203         } 204  205         /// <summary> 206         /// 功能描述:获取江苏验证码结果 207         /// 作  者:huangzh 208         /// 创建日期:2016-09-02 09:35:09 209         /// 任务编号: 210         /// </summary> 211         /// <param name="bitImage">bitImage</param> 212         /// <returns>返回值</returns> 213         private string GetJiangSu(Bitmap bitImage) 214         { 215             //灰度   216             bitImage = HuiDu(bitImage); 217  218             //二值化 219             bitImage = ErZhi(bitImage); 220  221             //反转 222             bitImage = ColorFanZhuan(bitImage); 223  224             //去噪            225             bitImage = QuZao(bitImage); 226  227             //毛边 228             bitImage = ClearMaoBian(bitImage); 229  230             //反转 231             bitImage = ColorFanZhuan(bitImage); 232  233             //毛边 234             bitImage = ClearMaoBian(bitImage); 235  236             //反转 237             bitImage = ColorFanZhuan(bitImage); 238  239             //标记识别             240             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 241  242             return string.Join("", lstChar); 243         } 244  245         /// <summary> 246         /// 功能描述:获取江西验证码结果 247         /// 作  者:huangzh 248         /// 创建日期:2016-09-02 10:18:13 249         /// 任务编号: 250         /// </summary> 251         /// <param name="bitImage">bitImage</param> 252         /// <returns>返回值</returns> 253         private string GetJiangXi(Bitmap bitImage) 254         { 255             //灰度   256             bitImage = HuiDu(bitImage); 257  258             //二值化 259             bitImage = ErZhi(bitImage); 260  261             //反转 262             bitImage = ColorFanZhuan(bitImage); 263  264             //去噪            265             bitImage = QuZao(bitImage); 266  267             //标记识别             268             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 269             string strNum1 = string.Empty; 270             string strYun = string.Empty; 271             string strNum2 = string.Empty; 272             foreach (string strItem in lstChar) 273             { 274                 if (Regex.IsMatch(strItem, @"\d+")) 275                 { 276                     if (string.IsNullOrEmpty(strYun)) 277                     { 278                         strNum1 += strItem; 279                     } 280                     else 281                     { 282                         strNum2 += strItem; 283                     } 284                 } 285                 else if (Regex.IsMatch(strItem, @"\+|\-|\#")) 286                 { 287                     if (string.IsNullOrEmpty(strYun)) 288                     { 289                         strYun = strItem; 290                     } 291                 } 292                 else if (Regex.IsMatch(strItem, @"\=")) 293                 { 294  295                 } 296             } 297  298             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 299             { 300                 int intNum1 = int.Parse(strNum1); 301                 int intNum2 = int.Parse(strNum2); 302                 switch (strYun) 303                 { 304                     case "+": return (intNum1 + intNum2).ToString(); 305                     case "-": return (intNum1 - intNum2).ToString(); 306                     case "#": return (intNum1 * intNum2).ToString(); 307                     default: return string.Empty; 308                 } 309             } 310             return string.Empty; 311         } 312  313         /// <summary> 314         /// 功能描述:获取重庆验证码结果 315         /// 作  者:huangzh 316         /// 创建日期:2016-09-02 10:30:53 317         /// 任务编号: 318         /// </summary> 319         /// <param name="bitImage">bitImage</param> 320         /// <returns>返回值</returns> 321         private string GetChongQing(Bitmap bitImage) 322         { 323             //灰度   324             bitImage = HuiDu(bitImage); 325  326             //二值化 327             bitImage = ErZhi(bitImage); 328  329             //反转 330             bitImage = ColorFanZhuan(bitImage); 331  332             //去噪            333             bitImage = QuZao(bitImage); 334  335             //毛边 336             bitImage = ClearMaoBian(bitImage); 337  338             //标记识别             339             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 340             string strNum1 = string.Empty; 341             string strYun = string.Empty; 342             string strNum2 = string.Empty; 343             foreach (string strItem in lstChar) 344             { 345                 if (Regex.IsMatch(strItem, @"\d+")) 346                 { 347                     if (string.IsNullOrEmpty(strYun)) 348                     { 349                         strNum1 += strItem; 350                     } 351                     else 352                     { 353                         strNum2 += strItem; 354                     } 355                 } 356                 else if (Regex.IsMatch(strItem, @"\+|\-|\#")) 357                 { 358                     if (string.IsNullOrEmpty(strYun)) 359                     { 360                         strYun = strItem; 361                     } 362                 } 363                 else if (Regex.IsMatch(strItem, @"\=")) 364                 { 365  366                 } 367             } 368  369             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 370             { 371                 int intNum1 = int.Parse(strNum1); 372                 int intNum2 = int.Parse(strNum2); 373                 switch (strYun) 374                 { 375                     case "+": return (intNum1 + intNum2).ToString(); 376                     case "-": return (intNum1 - intNum2).ToString(); 377                     case "#": return (intNum1 * intNum2).ToString(); 378                     default: return string.Empty; 379                 } 380             } 381             return string.Empty; 382         } 383  384         /// <summary> 385         /// 功能描述:获取宁夏验证码结果 386         /// 作  者:huangzh 387         /// 创建日期:2016-09-02 10:41:18 388         /// 任务编号: 389         /// </summary> 390         /// <param name="bitImage">bitImage</param> 391         /// <returns>返回值</returns> 392         private string GetNingXia(Bitmap bitImage) 393         { 394             //灰度   395             bitImage = HuiDu(bitImage); 396  397             //二值化 398             bitImage = ErZhi(bitImage); 399  400             //反转 401             bitImage = ColorFanZhuan(bitImage); 402  403             //去噪            404             bitImage = QuZao(bitImage); 405  406             //标记识别             407             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 408             string strNum1 = string.Empty; 409             string strYun = string.Empty; 410             string strNum2 = string.Empty; 411             foreach (string strItem in lstChar) 412             { 413                 if (Regex.IsMatch(strItem, @"\d+")) 414                 { 415                     if (string.IsNullOrEmpty(strYun)) 416                     { 417                         strNum1 += strItem; 418                     } 419                     else 420                     { 421                         strNum2 += strItem; 422                     } 423                 } 424                 else if (Regex.IsMatch(strItem, @"\+|\-|\#")) 425                 { 426                     if (string.IsNullOrEmpty(strYun)) 427                     { 428                         strYun = strItem; 429                     } 430                 } 431                 else if (Regex.IsMatch(strItem, @"\=")) 432                 { 433  434                 } 435             } 436  437             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 438             { 439                 int intNum1 = int.Parse(strNum1); 440                 int intNum2 = int.Parse(strNum2); 441                 switch (strYun) 442                 { 443                     case "+": return (intNum1 + intNum2).ToString(); 444                     case "-": return (intNum1 - intNum2).ToString(); 445                     case "#": return (intNum1 * intNum2).ToString(); 446                     default: return string.Empty; 447                 } 448             } 449             return string.Empty; 450         } 451  452         /// <summary> 453         /// 功能描述:获取新疆验证码结果 454         /// 作  者:huangzh 455         /// 创建日期:2016-09-02 10:46:09 456         /// 任务编号: 457         /// </summary> 458         /// <param name="bitImage">bitImage</param> 459         /// <returns>返回值</returns> 460         private string GetXinJiang(Bitmap bitImage) 461         { 462             //灰度   463             bitImage = HuiDu(bitImage); 464  465             //二值化 466             bitImage = ErZhi(bitImage); 467  468             //反转 469             bitImage = ColorFanZhuan(bitImage); 470  471             //去噪            472             bitImage = QuZao(bitImage); 473  474             List<Bitmap> lstBits = GetLianTongImage(bitImage); 475  476  477             //int intWidth = int.Parse(m_xml.ConvertIdToName("maxWidth", "-1")); 478             //for (int i = 0; i < lstBits.Count; i++) 479             //{ 480             //    Bitmap bit = lstBits[i]; 481             //    int intMinWidth = GetMinBitmap(bit).Width; 482             //    if (intMinWidth >= intWidth + 2) 483             //    { 484             //        Bitmap bit1 = bit.Clone(new Rectangle(0, 0, intWidth, bit.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 485             //        Bitmap bit2 = bit.Clone(new Rectangle(intWidth, 0, bit.Width - intWidth, bit.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 486             //        lstBits.RemoveAt(i); 487             //        lstBits.Insert(i, bit2); 488             //        lstBits.Insert(i, bit1); 489             //        break; 490             //    } 491             //} 492  493             //标记识别             494             List<string> lstChar = GetImageChar(lstBits); 495             string strNum1 = string.Empty; 496             string strYun = string.Empty; 497             string strNum2 = string.Empty; 498             foreach (string strItem in lstChar) 499             { 500                 if (Regex.IsMatch(strItem, @"\d+")) 501                 { 502                     if (string.IsNullOrEmpty(strYun)) 503                     { 504                         strNum1 += strItem; 505                     } 506                     else 507                     { 508                         strNum2 += strItem; 509                     } 510                 } 511                 else if (Regex.IsMatch(strItem, @"\+|\-|\#")) 512                 { 513                     if (string.IsNullOrEmpty(strYun)) 514                     { 515                         strYun = strItem; 516                     } 517                 } 518                 else if (Regex.IsMatch(strItem, @"\=")) 519                 { 520                     break; 521                 } 522             } 523  524             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 525             { 526                 int intNum1 = int.Parse(strNum1); 527                 int intNum2 = int.Parse(strNum2); 528                 switch (strYun) 529                 { 530                     case "+": return (intNum1 + intNum2).ToString(); 531                     case "-": return (intNum1 - intNum2).ToString(); 532                     case "#": return (intNum1 * intNum2).ToString(); 533                     default: return string.Empty; 534                 } 535             } 536             return string.Empty; 537         } 538  539  540  541         /// <summary> 542         /// 功能描述:获取天眼查验证码结果 543         /// 作  者:huangzh 544         /// 创建日期:2016-09-06 12:28:32 545         /// 任务编号: 546         /// </summary> 547         /// <param name="bitImage">bitImage</param> 548         /// <returns>返回值</returns> 549         private string GetTianYanCha(Bitmap bitImage) 550         { 551             bitImage = ClearBroder(bitImage); 552             bitImage = HuiDu(bitImage); 553             bitImage = ErZhi(bitImage); 554             bitImage = ColorFanZhuan(bitImage); 555             bitImage = QuZao(bitImage); 556             List<Bitmap> lstImages = GetLianTongImage(bitImage); 557             List<string> lstChar = GetImageChar(lstImages); 558             return string.Join("", lstChar); 559         } 560  561         /// <summary> 562         /// 功能描述:获取北京验证码结果 563         /// 作  者:huangzh 564         /// 创建日期:2016-09-07 16:14:42 565         /// 任务编号: 566         /// </summary> 567         /// <param name="bitImage">bitImage</param> 568         /// <returns>返回值</returns> 569         private string GetBeiJing(Bitmap bitImage) 570         { 571             bitImage = ClearColor(bitImage); 572  573             //灰度   574             bitImage = HuiDu(bitImage); 575  576             //二值化 577             bitImage = ErZhi(bitImage); 578  579             //反转 580             bitImage = ColorFanZhuan(bitImage); 581  582             //去噪            583             bitImage = QuZao(bitImage); 584  585             //标记识别             586             List<string> lstChar = GetImageChar(GetLianTongImage(bitImage)); 587             string strNum1 = string.Empty; 588             string strYun = string.Empty; 589             string strNum2 = string.Empty; 590             foreach (string strItem in lstChar) 591             { 592                 if (strItem == "$") 593                     continue; 594                 if (Regex.IsMatch(strItem, @"\d+")) 595                 { 596                     if (string.IsNullOrEmpty(strYun)) 597                     { 598                         if (string.IsNullOrEmpty(strNum1)) 599                             strNum1 = strItem; 600                         else if (strItem != "1") 601                             strNum1 = strItem; 602                     } 603                     else 604                     { 605                         if (string.IsNullOrEmpty(strNum2)) 606                         { 607                             strNum2 = strItem; 608                             if (strItem != "1") 609                                 break; 610                         } 611                         else if (strItem != "1") 612                             strNum2 = strItem; 613                     } 614                 } 615                 else if (Regex.IsMatch(strItem, @"\+|\-|\#")) 616                 { 617                     if (string.IsNullOrEmpty(strYun)) 618                     { 619                         strYun = strItem; 620                     } 621                 } 622                 else if (Regex.IsMatch(strItem, @"\=")) 623                 { 624                     break; 625                 } 626             } 627  628             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 629             { 630                 int intNum1 = int.Parse(strNum1); 631                 int intNum2 = int.Parse(strNum2); 632                 switch (strYun) 633                 { 634                     case "+": return (intNum1 + intNum2).ToString(); 635                     case "-": return (intNum1 - intNum2).ToString(); 636                     case "#": return (intNum1 * intNum2).ToString(); 637                     default: return string.Empty; 638                 } 639             } 640             return string.Empty; 641         } 642  643         /// <summary> 644         /// 功能描述:获取青海验证码结果 645         /// 作  者:huangzh 646         /// 创建日期:2016-09-08 17:20:13 647         /// 任务编号: 648         /// </summary> 649         /// <param name="bitImage">bitImage</param> 650         /// <returns>返回值</returns> 651         private string GetQingHai(Bitmap bitImage) 652         { 653             Bitmap bitBase = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 654             bitImage = ClearColor(bitImage); 655  656             //灰度   657             bitImage = HuiDu(bitImage); 658  659             //二值化 660             bitImage = ErZhi(bitImage); 661  662             //反转 663             bitImage = ColorFanZhuan(bitImage); 664  665             //去噪            666             bitImage = QuZao(bitImage); 667  668             List<Bitmap> lstImages = GetTouYingImages(bitImage, bitBase); 669             //for (int i = 0; i < lstImages.Count; i++) 670             //{ 671             //    lstImages[i].Save("d:\\" + i + ".jpg"); 672             //} 673             //标记识别             674             List<string> lstChar = GetImageChar(lstImages); 675             string strNum1 = string.Empty; 676             string strYun = string.Empty; 677             string strNum2 = string.Empty; 678             foreach (string strItem in lstChar) 679             { 680                 if (strItem == "$") 681                     continue; 682                 if (Regex.IsMatch(strItem, @"\d+")) 683                 { 684                     if (string.IsNullOrEmpty(strYun)) 685                     { 686                         strNum1 += strItem; 687                     } 688                     else 689                     { 690                         strNum2 = strItem; 691                     } 692                 } 693                 else if (Regex.IsMatch(strItem, @"\+|\-|\#|\%")) 694                 { 695                     if (string.IsNullOrEmpty(strYun)) 696                     { 697                         strYun = strItem; 698                     } 699                 } 700                 else if (Regex.IsMatch(strItem, @"\=")) 701                 { 702                     break; 703                 } 704             } 705  706             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 707             { 708                 int intNum1 = int.Parse(strNum1); 709                 int intNum2 = int.Parse(strNum2); 710                 switch (strYun) 711                 { 712                     case "+": return (intNum1 + intNum2).ToString(); 713                     case "-": return (intNum1 - intNum2).ToString(); 714                     case "#": return (intNum1 * intNum2).ToString(); 715                     case "%": return (intNum1 / intNum2).ToString(); 716                     default: return string.Empty; 717                 } 718             } 719             return string.Empty; 720         } 721  722         /// <summary> 723         /// 功能描述:获取山西识别结果 724         /// 作  者:huangzh 725         /// 创建日期:2016-09-09 12:14:46 726         /// 任务编号: 727         /// </summary> 728         /// <param name="bitImage">bitImage</param> 729         /// <returns>返回值</returns> 730         private string GetShanXi(Bitmap bitImage) 731         { 732             Bitmap bitBase = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 733             bitImage = ClearColor(bitImage); 734  735             //灰度   736             bitImage = HuiDu(bitImage); 737  738             //二值化 739             bitImage = ErZhi(bitImage); 740  741             //反转 742             bitImage = ColorFanZhuan(bitImage); 743  744             //去噪            745             bitImage = QuZao(bitImage); 746  747             List<Bitmap> lstImages = GetTouYingImages(bitImage, bitBase, 1); 748             //for (int i = 0; i < lstImages.Count; i++) 749             //{ 750             //    lstImages[i].Save("d:\\" + i + ".jpg"); 751             //} 752             //标记识别             753             List<string> lstChar = GetImageChar(lstImages); 754             string strNum1 = string.Empty; 755             string strYun = string.Empty; 756             string strNum2 = string.Empty; 757             foreach (string strItem in lstChar) 758             { 759                 if (strItem == "$") 760                     continue; 761                 if (Regex.IsMatch(strItem, @"\d+")) 762                 { 763                     if (string.IsNullOrEmpty(strYun)) 764                     { 765                         strNum1 += strItem; 766                     } 767                     else if (string.IsNullOrEmpty(strNum2)) 768                     { 769                         strNum2 = strItem; 770                     } 771                 } 772                 else if (Regex.IsMatch(strItem, @"\+|\-|\#|\%")) 773                 { 774                     if (string.IsNullOrEmpty(strYun)) 775                     { 776                         strYun = strItem; 777                     } 778                 } 779                 else if (Regex.IsMatch(strItem, @"\=")) 780                 { 781                     break; 782                 } 783             } 784  785             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 786             { 787                 int intNum1 = int.Parse(strNum1); 788                 int intNum2 = int.Parse(strNum2); 789                 switch (strYun) 790                 { 791                     case "+": return (intNum1 + intNum2).ToString(); 792                     case "-": return (intNum1 - intNum2).ToString(); 793                     case "#": return (intNum1 * intNum2).ToString(); 794                     case "%": return (intNum1 / intNum2).ToString(); 795                     default: return string.Empty; 796                 } 797             } 798             return string.Empty; 799         } 800  801         /// <summary> 802         /// 功能描述:获取黑龙江验证码结果 803         /// 作  者:huangzh 804         /// 创建日期:2016-09-09 16:46:32 805         /// 任务编号: 806         /// </summary> 807         /// <param name="bitImage">bitImage</param> 808         /// <returns>返回值</returns> 809         private string GetHeiLongJiang(Bitmap bitImage) 810         { 811             Bitmap bitBase = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 812             bitImage = ClearColor(bitImage); 813  814             //灰度   815             bitImage = HuiDu(bitImage); 816  817             //二值化 818             bitImage = ErZhi(bitImage); 819  820             //反转 821             bitImage = ColorFanZhuan(bitImage); 822  823             //去噪            824             bitImage = QuZao(bitImage); 825  826             List<Bitmap> lstImages = GetTouYingImages(bitImage, bitBase, 1); 827             //for (int i = 0; i < lstImages.Count; i++) 828             //{ 829             //    lstImages[i].Save("d:\\" + i + ".jpg"); 830             //} 831             //标记识别             832             List<string> lstChar = GetImageChar(lstImages); 833             string strNum1 = string.Empty; 834             string strYun = string.Empty; 835             string strNum2 = string.Empty; 836             foreach (string strItem in lstChar) 837             { 838                 if (strItem == "$") 839                     continue; 840                 if (Regex.IsMatch(strItem, @"\d+")) 841                 { 842                     if (string.IsNullOrEmpty(strYun)) 843                     { 844                         strNum1 += strItem; 845                     } 846                     else if (string.IsNullOrEmpty(strNum2)) 847                     { 848                         strNum2 = strItem; 849                     } 850                 } 851                 else if (Regex.IsMatch(strItem, @"\+|\-|\#|\%")) 852                 { 853                     if (string.IsNullOrEmpty(strYun)) 854                     { 855                         strYun = strItem; 856                     } 857                 } 858                 else if (Regex.IsMatch(strItem, @"\=")) 859                 { 860                     break; 861                 } 862             } 863  864             if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strYun) && !string.IsNullOrEmpty(strNum2)) 865             { 866                 int intNum1 = int.Parse(strNum1); 867                 int intNum2 = int.Parse(strNum2); 868                 switch (strYun) 869                 { 870                     case "+": return (intNum1 + intNum2).ToString(); 871                     case "-": return (intNum1 - intNum2).ToString(); 872                     case "#": return (intNum1 * intNum2).ToString(); 873                     case "%": return (intNum1 / intNum2).ToString(); 874                     default: return string.Empty; 875                 } 876             } 877             return string.Empty; 878         } 879  880         #endregion 881  882         #region 去除边框 883         private Bitmap ClearBroder(Bitmap bitImage) 884         { 885             string[] strs = m_xml.ConvertIdToName("01").Split(,);//上,右,下,左 886             int[] widths = { int.Parse(strs[0]), int.Parse(strs[1]), int.Parse(strs[2]), int.Parse(strs[3]) }; 887             Bitmap bit = (bitImage as Bitmap).Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 888             int intWidth = bit.Width; 889             int intHeight = bit.Height; 890             //左右 891             int inti1 = widths[3]; 892             int inti2 = widths[1]; 893             for (int i = 0; i < intWidth; i++) 894             { 895                 if (i < inti1 || i >= intWidth - inti2) 896                 { 897                     for (int j = 0; j < intHeight; j++) 898                     { 899                         Console.WriteLine(i + "," + j); 900                         bit.SetPixel(i, j, Color.White); 901                     } 902                 } 903             } 904  905             int intj1 = widths[0]; 906             int intj2 = widths[2]; 907             for (int j = 0; j < intHeight; j++) 908             { 909                 if (j < intj1 || j >= intHeight - intj2) 910                 { 911                     for (int i = 0; i < intWidth; i++) 912                     { 913                         Console.WriteLine(i + "," + j); 914                         bit.SetPixel(i, j, Color.White); 915                     } 916                 } 917             } 918             return bit; 919         } 920         #endregion 921  922         #region 颜色去除 923         /// <summary> 924         /// 功能描述:颜色去除 925         /// 作  者:huangzh 926         /// 创建日期:2016-09-01 15:28:08 927         /// 任务编号: 928         /// </summary> 929         /// <param name="bitImage">bitImage</param> 930         /// <returns>返回值</returns> 931         private Bitmap ClearColor(Bitmap bitImage) 932         { 933             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 934  935             string[] strs = m_xml.ConvertIdToName("11").Split(|); 936             List<Color> lstCS = new List<Color>(); 937             foreach (var item in strs) 938             { 939                 string[] colorStrs = item.Split(,); 940                 Color c = Color.FromArgb(int.Parse(colorStrs[0]), int.Parse(colorStrs[1]), int.Parse(colorStrs[2])); 941                 lstCS.Add(c); 942             } 943             int intCha = int.Parse(m_xml.ConvertIdToName("12")); 944             string[] toStrs = m_xml.ConvertIdToName("13").Split(,); 945             Color cTo = Color.FromArgb(int.Parse(toStrs[0]), int.Parse(toStrs[1]), int.Parse(toStrs[2])); 946  947             int intWidth = bit.Width; 948             int intHeight = bit.Height; 949             for (int i = 0; i < intWidth; i++) 950             { 951                 for (int j = 0; j < intHeight; j++) 952                 { 953                     Color c = bit.GetPixel(i, j); 954                     foreach (var item in lstCS) 955                     { 956                         if (IsClearColor(item, c, intCha)) 957                         { 958                             bit.SetPixel(i, j, cTo); 959                             break; 960                         } 961                     } 962  963                 } 964             } 965  966             return bit; 967         } 968  969         /// <summary> 970         /// 功能描述:是否需要清除颜色 971         /// 作  者:huangzh 972         /// 创建日期:2016-09-01 15:27:28 973         /// 任务编号: 974         /// </summary> 975         /// <param name="c1">c1</param> 976         /// <param name="c2">c2</param> 977         /// <param name="intCha">intCha</param> 978         /// <returns>返回值</returns> 979         private bool IsClearColor( 980             Color c1, 981             Color c2, 982             int intCha) 983         { 984             return Math.Abs(c1.R - c2.R) < intCha && Math.Abs(c1.G - c2.G) < intCha && Math.Abs(c1.B - c2.B) < intCha; 985         } 986         #endregion 987  988         #region 灰度 989         /// <summary> 990         /// 功能描述:灰度 991         /// 作  者:huangzh 992         /// 创建日期:2016-09-01 15:31:00 993         /// 任务编号: 994         /// </summary> 995         /// <param name="bitImage">bitImage</param> 996         /// <returns>返回值</returns> 997         private Bitmap HuiDu( 998             Bitmap bitImage) 999         {1000             string[] cs = m_xml.ConvertIdToName("21").Split(,);1001 1002             double dbl1 = double.Parse(cs[0]) / 100;1003             double dbl2 = double.Parse(cs[1]) / 100;1004             double dbl3 = double.Parse(cs[2]) / 100;1005             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1006             Grayscale filter = new Grayscale(dbl1, dbl2, dbl3);1007             // apply the filter1008             Bitmap grayImage = filter.Apply(bit);1009             return grayImage;1010         }1011         #endregion1012 1013         #region 二值化1014         /// <summary>1015         /// 功能描述:二值化1016         /// 作  者:huangzh1017         /// 创建日期:2016-09-01 15:33:281018         /// 任务编号:1019         /// </summary>1020         /// <param name="bitImage">bitImage</param>1021         /// <returns>返回值</returns>1022         private Bitmap ErZhi(Bitmap bitImage)1023         {1024             int intErZhi = int.Parse(m_xml.ConvertIdToName("31"));1025             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format8bppIndexed);1026             Threshold filter = new Threshold(intErZhi);1027             // apply the filter1028             filter.ApplyInPlace(bit);1029             return bit;1030         }1031         #endregion1032 1033         #region 颜色反转1034         /// <summary>1035         /// 功能描述:颜色反转1036         /// 作  者:huangzh1037         /// 创建日期:2016-09-01 15:34:091038         /// 任务编号:1039         /// </summary>1040         /// <param name="image">image</param>1041         /// <returns>返回值</returns>1042         private Bitmap ColorFanZhuan(Bitmap image)1043         {1044             image = image.Clone(new Rectangle(0, 0, image.Width, image.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1045             for (int i = 0; i < image.Width; i++)1046             {1047                 for (int j = 0; j < image.Height; j++)1048                 {1049                     Color c = image.GetPixel(i, j);1050                     if (c.Name != "ffffffff")1051                     {1052                         image.SetPixel(i, j, Color.White);1053                     }1054                     else1055                     {1056                         image.SetPixel(i, j, Color.Black);1057                     }1058                 }1059             }1060             return image;1061         }1062         #endregion1063 1064         #region 去噪1065         /// <summary>1066         /// 功能描述:去噪1067         /// 作  者:huangzh1068         /// 创建日期:2016-09-01 15:35:581069         /// 任务编号:1070         /// </summary>1071         /// <param name="bitImage">bitImage</param>1072         /// <returns>返回值</returns>1073         private Bitmap QuZao(Bitmap bitImage)1074         {1075             string[] strSizeZao = m_xml.ConvertIdToName("41").Split(,);1076             Size size = new Size(int.Parse(strSizeZao[0]), int.Parse(strSizeZao[1]));1077             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1078             bit = new BlobsFiltering(size.Width, size.Height, bit.Width, bit.Height).Apply(bit);1079             return bit;1080         }1081         #endregion1082 1083         #region 去毛边1084         /// <summary>1085         /// 功能描述:去毛边1086         /// 作  者:huangzh1087         /// 创建日期:2016-09-01 15:36:371088         /// 任务编号:1089         /// </summary>1090         /// <param name="bitImg">bitImg</param>1091         /// <returns>返回值</returns>1092         private static Bitmap ClearMaoBian(Bitmap bitImg)1093         {1094             Bitmap bit = bitImg.Clone(new Rectangle(0, 0, bitImg.Width, bitImg.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1095 1096             for (int i = 0; i < bit.Width; i++)1097             {1098 1099                 for (int j = 0; j < bit.Height; j++)1100                 {1101                     //  Console.WriteLine(i + "," + j);1102                     Color c = bit.GetPixel(i, j);1103 1104                     if (c.Name == "ffffffff")1105                     {1106                         //判定上下左右1107                         int intCount = 0;1108                         //1109                         if (j > 0)1110                         {1111                             Color c1 = bit.GetPixel(i, j - 1);1112                             if (c1.Name != "ffffffff")1113                                 intCount++;1114                         }1115                         else1116                         {1117                             intCount++;1118                         }1119                         //1120                         if (j < bit.Height - 1)1121                         {1122                             Color c2 = bit.GetPixel(i, j + 1);1123                             if (c2.Name != "ffffffff")1124                                 intCount++;1125                         }1126                         else1127                         {1128                             intCount++;1129                         }1130                         //1131                         if (i > 0)1132                         {1133                             Color c3 = bit.GetPixel(i - 1, j);1134                             if (c3.Name != "ffffffff")1135                                 intCount++;1136                         }1137                         else1138                         {1139                             intCount++;1140                         }1141                         //1142                         if (i < bit.Width - 1)1143                         {1144                             Color c4 = bit.GetPixel(i + 1, j);1145                             if (c4.Name != "ffffffff")1146                                 intCount++;1147                         }1148                         else1149                         {1150                             intCount++;1151                         }1152 1153                         if (intCount >= 3)1154                         {1155                             bit.SetPixel(i, j, Color.Black);1156                         }1157                     }1158 1159                 }1160 1161             }1162             return bit;1163         }1164         #endregion1165 1166         #region 连通并识别1167 1168         /// <summary>1169         /// 功能描述:识别字符1170         /// 作  者:huangzh1171         /// 创建日期:2016-09-02 09:06:441172         /// 任务编号:1173         /// </summary>1174         /// <param name="lstImage">lstImage</param>1175         /// <returns>返回值</returns>1176         private List<string> GetImageChar(List<Bitmap> lstImage)1177         {1178             string strPath = Path.Combine(m_strModePath, "imgs");1179 1180             List<string> lstKeys = new List<string>();1181             Console.WriteLine("--------------");1182             foreach (var item in lstImage)1183             {1184                 string strKey = GetTextByOneChar(item, strPath);1185                 lstKeys.Add(strKey);1186                 Console.WriteLine(strKey);1187             }1188 1189             return lstKeys;1190         }1191 1192         /// <summary>1193         /// 功能描述:获取连通1194         /// 作  者:huangzh1195         /// 创建日期:2016-09-01 15:50:181196         /// 任务编号:1197         /// </summary>1198         /// <param name="bitImage">bitImage</param>1199         /// <param name="minSize">最小连通域</param>1200         /// <param name="blnIsCheckWidth">合并检测</param>1201         /// <param name="intMaxWidth">当blnIsCheckWidth=true时,单个字符最大宽度</param>1202         /// <param name="blnIsCheckMinWidth">是否旋转为最小宽度</param>1203         /// <returns></returns>1204         private List<Bitmap> GetLianTongImage(Bitmap bitImage)1205         {1206             string[] strSizeBiao = m_xml.ConvertIdToName("51").Split(,);1207             Size minSize = new Size(int.Parse(strSizeBiao[0]), int.Parse(strSizeBiao[1]));1208             bool blnIsCheckWidth = bool.Parse(m_xml.ConvertIdToName("52"));1209             int intMaxWidth = int.Parse(m_xml.ConvertIdToName("53"));1210             bool blnIsCheckMinWidth = bool.Parse(m_xml.ConvertIdToName("54"));1211 1212             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1213             Bitmap imageCache = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1214             // process image with blob counter1215             BlobCounter blobCounter = new BlobCounter();1216             blobCounter.ProcessImage(bit);1217             Blob[] blobs = blobCounter.GetObjectsInformation();1218 1219             // create convex hull searching algorithm1220             GrahamConvexHull hullFinder = new GrahamConvexHull();1221 1222             // lock image to draw on it1223             BitmapData data =http://www.mamicode.com/ bit.LockBits(1224                 new Rectangle(0, 0, bit.Width, bit.Height),1225                     ImageLockMode.ReadWrite, bit.PixelFormat);1226 1227             Dictionary<Bitmap, int> lstBitNew = new Dictionary<Bitmap, int>();1228 1229             Dictionary<List<IntPoint>, int> lstedgePoints = new Dictionary<List<IntPoint>, int>();1230 1231             // process each blob1232             foreach (Blob blob in blobs)1233             {1234                 List<IntPoint> leftPoints = new List<IntPoint>();1235                 List<IntPoint> rightPoints = new List<IntPoint>();1236                 List<IntPoint> edgePoints = new List<IntPoint>();1237 1238                 // get blob‘s edge points1239                 blobCounter.GetBlobsLeftAndRightEdges(blob,1240                     out leftPoints, out rightPoints);1241 1242                 edgePoints.AddRange(leftPoints);1243                 edgePoints.AddRange(rightPoints);1244 1245                 // blob‘s convex hull1246                 List<IntPoint> hull = hullFinder.FindHull(edgePoints);1247 1248 1249 1250                 lstedgePoints.Add(hull, GetMinX(hull));1251             }1252 1253             List<List<IntPoint>> dicLstPoints = (from d in lstedgePoints1254                                                  orderby d.Value ascending1255                                                  select d.Key).ToList();1256 1257             if (blnIsCheckWidth)1258             {1259                 #region 检测连通域是否可合并1260                 bool isBreak = false;1261                 while (!isBreak)1262                 {1263                     isBreak = true;1264 1265                     int intKeyLength = dicLstPoints.Count;1266                     for (int i = 0; i < intKeyLength; i++)1267                     {1268                         if (i != 0)1269                         {1270                             bool bln = CheckIsHeBing(dicLstPoints[i - 1], dicLstPoints[i], intMaxWidth);1271                             if (bln)1272                             {1273                                 dicLstPoints[i].AddRange(dicLstPoints[i - 1]);1274                                 dicLstPoints.RemoveAt(i - 1);1275                                 isBreak = false;1276                                 break;1277                             }1278                         }1279 1280                         if (i != intKeyLength - 1)1281                         {1282                             bool bln = CheckIsHeBing(dicLstPoints[i], dicLstPoints[i + 1], intMaxWidth);1283                             if (bln)1284                             {1285                                 dicLstPoints[i].AddRange(dicLstPoints[i + 1]);1286                                 dicLstPoints.RemoveAt(i + 1);1287                                 isBreak = false;1288                                 break;1289                             }1290                         }1291                     }1292                 }1293                 #endregion1294             }1295 1296             foreach (List<IntPoint> item in dicLstPoints)1297             {1298                 List<IntPoint> hull = hullFinder.FindHull(item);1299                 int intMinX = 0;1300                 Bitmap bitNew = GetBitmapByListPoint(hull, imageCache, ref intMinX);1301                 if (bitNew.Width < minSize.Width || bitNew.Height < minSize.Height)1302                     continue;1303                 lstBitNew.Add(bitNew, intMinX);1304                 Drawing.Polygon(data, hull, Color.Red);1305             }1306 1307             bit.UnlockBits(data);1308 1309             Dictionary<Bitmap, int> dic1Asc1 = (from d in lstBitNew1310                                                 orderby d.Value ascending1311                                                 select d).ToDictionary(k => k.Key, v => v.Value);1312 1313             List<Bitmap> lstImage = new List<Bitmap>();1314 1315             foreach (var item in dic1Asc1)1316             {1317                 Bitmap bitItem = item.Key;1318                 bitItem = ToResizeAndCenter(bitItem);1319                 if (blnIsCheckMinWidth)1320                 {1321                     bitItem = GetMinWidthBitmap(bitItem);1322                 }1323                 lstImage.Add(bitItem);//添加图片    1324             }1325 1326             return lstImage;1327         }1328 1329         /// <summary>1330         /// 功能描述:识别单数字1331         /// 作  者:huangzh1332         /// 创建日期:2016-08-25 15:19:351333         /// 任务编号:1334         /// </summary>1335         /// <param name="bit">bit</param>1336         /// <param name="lstNoChar">lstNoChar</param>1337         /// <returns>返回值</returns>1338         private string GetTextByOneChar(Bitmap bit, string strSourceImagPath, List<string> lstNoChar = null)1339         {1340             bit = bit.Clone(new Rectangle(0, 0, bit.Width, bit.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1341             var files = Directory.GetFiles(strSourceImagPath);1342             if (lstNoChar != null && lstNoChar.Count > 0)1343             {1344                 var newFiles = from p in files1345                                where !lstNoChar.Contains(Path.GetFileName(p).Split(_)[0])1346                                select p;1347                 files = newFiles.ToArray<string>();1348             }1349 1350             var templateList = files.Select(i => { return new Bitmap(i); }).ToList();1351             var templateListFileName = files.Select(i => { return Path.GetFileName(i); }).ToList();1352 1353             var result = new List<string>();1354 1355             ExhaustiveTemplateMatching templateMatching = new ExhaustiveTemplateMatching(0.8f);1356 1357             float max = 0;1358             int index = 0;1359 1360             if (bit.Width <= 25 && bit.Height <= 25)1361                 bit = ToResizeAndCenter(bit);1362             //bit.Save("d:\\111.jpg");1363             for (int j = 0; j < templateList.Count; j++)1364             {1365                 var compare = templateMatching.ProcessImage(bit, templateList[j]);1366                 //if (templateListFileName[index].StartsWith("%"))1367                 //{1368                 //    Console.WriteLine(templateListFileName[index]);1369                 //}1370                 if (compare.Length > 0 && compare[0].Similarity > max)1371                 {1372                     //记录下最相似的1373                     max = compare[0].Similarity;1374                     index = j;1375                 }1376             }1377             if (templateListFileName.Count > 0)1378                 return templateListFileName[index].Split(_)[0];1379             else1380                 return "";1381         }1382 1383 1384         /// <summary>1385         /// 功能描述:得到最小x1386         /// 作  者:huangzh1387         /// 创建日期:2016-09-01 15:42:221388         /// 任务编号:1389         /// </summary>1390         /// <param name="hull">hull</param>1391         /// <returns>返回值</returns>1392         private int GetMinX(List<IntPoint> hull)1393         {1394             int x = int.MaxValue;1395             foreach (IntPoint item in hull)1396             {1397                 if (item.X < x)1398                     x = item.X;1399             }1400             return x;1401         }1402 1403         /// <summary>1404         /// 功能描述:检查是否需要合并(目前仅检查x方向合并)1405         /// 作  者:huangzh1406         /// 创建日期:2016-09-01 15:42:561407         /// 任务编号:1408         /// </summary>1409         /// <param name="lst1">lst1</param>1410         /// <param name="lst2">lst2</param>1411         /// <param name="intMaxWidth">intMaxWidth</param>1412         /// <returns>返回值</returns>1413         private bool CheckIsHeBing(List<IntPoint> lst1, List<IntPoint> lst2, int intMaxWidth)1414         {1415             int minx1 = int.MaxValue, minx2 = int.MaxValue;1416             int maxx1 = int.MinValue, maxx2 = int.MinValue;1417 1418             foreach (IntPoint item in lst1)1419             {1420                 if (item.X > maxx1)1421                     maxx1 = item.X;1422                 if (item.X < minx1)1423                     minx1 = item.X;1424             }1425 1426             foreach (IntPoint item in lst2)1427             {1428                 if (item.X > maxx2)1429                     maxx2 = item.X;1430                 if (item.X < minx2)1431                     minx2 = item.X;1432             }1433 1434             int intCenter1 = minx1 + (maxx1 - minx1) / 2;1435             int intCenter2 = minx2 + (maxx2 - minx2) / 2;1436             if ((intCenter1 > minx2 && intCenter1 < maxx2) || (intCenter2 > minx1 && intCenter2 < maxx1))1437             {1438                 int _intMin = minx1 < minx2 ? minx1 : minx2;1439                 int _intMax = maxx1 > maxx2 ? maxx1 : maxx2;1440 1441                 if (_intMax - _intMin > intMaxWidth)1442                     return false;1443                 else1444                     return true;1445             }1446             else1447                 return false;1448         }1449 1450         /// <summary>1451         /// 功能描述:根据坐标列表截图1452         /// 作  者:huangzh1453         /// 创建日期:2016-09-01 15:43:571454         /// 任务编号:1455         /// </summary>1456         /// <param name="hull">hull</param>1457         /// <param name="bitImg">bitImg</param>1458         /// <param name="_minX">_minX</param>1459         /// <returns>返回值</returns>1460         private Bitmap GetBitmapByListPoint(List<IntPoint> hull, Bitmap bitImg, ref int _minX)1461         {1462             int minx = int.MaxValue;1463             int miny = int.MaxValue;1464             int maxx = int.MinValue;1465             int maxy = int.MinValue;1466             foreach (IntPoint item in hull)1467             {1468                 if (item.X > maxx)1469                     maxx = item.X;1470                 if (item.X < minx)1471                     minx = item.X;1472 1473                 if (item.Y > maxy)1474                     maxy = item.Y;1475                 if (item.Y < miny)1476                     miny = item.Y;1477             }1478 1479             Bitmap bit = new Bitmap(maxx - minx + 1, maxy - miny + 1);1480             int bitImgWidth = bitImg.Width;1481             int bitImgHeight = bitImg.Height;1482             for (int i = minx; i <= maxx; i++)1483             {1484                 for (int j = miny; j <= maxy; j++)1485                 {1486                     Color c = bitImg.GetPixel(i, j);1487                     if (c.R == 0)1488                         c = Color.White;1489                     else1490                         c = Color.Black;1491                     bit.SetPixel(i - minx, j - miny, c);1492                 }1493             }1494             _minX = minx;1495             // bit.Save("d:\\1\\" + Guid.NewGuid() + ".jpg");1496             return bit;1497         }1498 1499         /// <summary>1500         /// 功能描述:图片放到中心1501         /// 作  者:huangzh1502         /// 创建日期:2016-08-25 15:16:421503         /// 任务编号:1504         /// </summary>1505         /// <param name="bit">bit</param>1506         /// <param name="w">w</param>1507         /// <param name="h">h</param>1508         /// <returns>返回值</returns>1509         private Bitmap ToResizeAndCenter(Bitmap bit)1510         {1511             bit = bit.Clone(new Rectangle(0, 0, bit.Width, bit.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1512 1513             bit = new Invert().Apply(bit);1514 1515             int sw = bit.Width;1516             int sh = bit.Height;1517 1518             int w, h;1519             if (sw < 25 && sh < 25)1520             {1521                 w = 25;1522                 h = 25;1523             }1524             else1525             {1526                 w = sw + 5;1527                 h = sh + 5;1528             }1529 1530 1531             Crop corpFilter = new Crop(new Rectangle(0, 0, w, h));1532 1533             bit = corpFilter.Apply(bit);1534 1535             //再反转回去1536             bit = new Invert().Apply(bit);1537 1538             //计算中心位置1539             int centerX = (w - sw) / 2;1540             int centerY = (h - sh) / 2;1541 1542             bit = new CanvasMove(new IntPoint(centerX, centerY), Color.White).Apply(bit);1543             return bit;1544         }1545 1546         /// <summary>1547         /// 功能描述:得到左右30度最窄的图片1548         /// 作  者:huangzh1549         /// 创建日期:2016-08-25 14:58:321550         /// 任务编号:1551         /// </summary>1552         /// <param name="bitImg">bitImg</param>1553         /// <returns>返回值</returns>1554         private Bitmap GetMinWidthBitmap(Bitmap bitImg, float fltNum = 15)1555         {1556             Bitmap bitCache = bitImg;1557             for (float i = fltNum * -1; i < fltNum; i++)1558             {1559                 if (i == 0)1560                     continue;1561                 Bitmap bit1 = bitImg.Clone(new Rectangle(0, 0, bitImg.Width, bitImg.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1562                 Bitmap bit2 = RotateImage(bit1, i);1563                 Bitmap bit3 = GetMinBitmap(bit2);1564                 if (bit3.Width < bitCache.Width)1565                 {1566                     bitCache = bit3;1567                 }1568                 else1569                 {1570                     bit3.Dispose();1571                 }1572             }1573             return bitCache;1574         }1575 1576         /// <summary>1577         /// 功能描述:缩小图片1578         /// 作  者:huangzh1579         /// 创建日期:2016-08-25 14:55:461580         /// 任务编号:1581         /// </summary>1582         /// <param name="bit">bit</param>1583         /// <returns>返回值</returns>1584         private Bitmap GetMinBitmap(Bitmap bit)1585         {1586             int x1 = 0, y1 = 0;1587             int x2 = 0, y2 = 0;1588             GetXY(bit, ref x1, ref y1, ref x2, ref y2);1589             Bitmap bit11 = bit.Clone(new Rectangle(x1, y1, x2 - x1 + 1, y2 - y1 + 1), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1590             return bit11;1591         }1592 1593         /// <summary>1594         /// 功能描述:旋转图片1595         /// 作  者:huangzh1596         /// 创建日期:2016-08-25 14:57:111597         /// 任务编号:1598         /// </summary>1599         /// <param name="b">b</param>1600         /// <param name="angle">angle</param>1601         /// <returns>返回值</returns>1602         private Bitmap RotateImage(Bitmap b, float angle)1603         {1604             //对黑白进行颜色反转1605             b = ColorFanZhuan(b);1606             RotateNearestNeighbor filter = new RotateNearestNeighbor(angle, true);1607             Bitmap bnew = filter.Apply(b);1608             bnew = ColorFanZhuan(bnew);1609             return bnew;1610         }1611 1612         /// <summary>1613         /// 功能描述:获得最大最小xy1614         /// 作  者:huangzh1615         /// 创建日期:2016-08-25 14:55:561616         /// 任务编号:1617         /// </summary>1618         /// <param name="bit">bit</param>1619         /// <param name="x1">x1</param>1620         /// <param name="y1">y1</param>1621         /// <param name="x2">x2</param>1622         /// <param name="y2">y2</param>1623         private void GetXY(1624             Bitmap bit,1625             ref  int x1,1626             ref  int y1,1627             ref  int x2,1628             ref int y2)1629         {1630             bool bln = false;1631             #region 最小X1632             for (int i = 0; i < bit.Width; i++)1633             {1634                 for (int j = 0; j < bit.Height; j++)1635                 {1636                     Color c = bit.GetPixel(i, j);1637                     if (c.Name != "ffffffff")1638                     {1639                         x1 = i;1640                         bln = true;1641                         break;1642                     }1643                 }1644                 if (bln)1645                 {1646                     break;1647                 }1648             }1649             #endregion1650             #region 最大X1651             bln = false;1652             for (int i = bit.Width - 1; i >= 0; i--)1653             {1654                 for (int j = 0; j < bit.Height; j++)1655                 {1656                     Color c = bit.GetPixel(i, j);1657                     if (c.Name != "ffffffff")1658                     {1659                         x2 = i;1660                         bln = true;1661                         break;1662                     }1663                 }1664                 if (bln)1665                 {1666                     break;1667                 }1668             }1669             #endregion1670             #region 最小Y1671             bln = false;1672             for (int j = 0; j < bit.Height; j++)1673             {1674                 for (int i = 0; i < bit.Width; i++)1675                 {1676                     Color c = bit.GetPixel(i, j);1677                     if (c.Name != "ffffffff")1678                     {1679                         y1 = j;1680                         bln = true;1681                         break;1682                     }1683                 }1684                 if (bln)1685                 {1686                     break;1687                 }1688             }1689             #endregion1690             #region 最大Y1691             bln = false;1692             for (int j = bit.Height - 1; j >= 0; j--)1693             {1694                 for (int i = 0; i < bit.Width; i++)1695                 {1696                     Color c = bit.GetPixel(i, j);1697                     if (c.Name != "ffffffff")1698                     {1699                         y2 = j;1700                         bln = true;1701                         break;1702                     }1703                 }1704                 if (bln)1705                 {1706                     break;1707                 }1708             }1709             #endregion1710         }1711         #endregion1712 1713         #region 细化图片1714         /// <summary>1715         /// 功能描述:细化图片1716         /// 作  者:huangzh1717         /// 创建日期:2016-09-01 16:07:131718         /// 任务编号:1719         /// </summary>1720         /// <param name="bitImage">bitImage</param>1721         /// <returns>返回值</returns>1722         private Bitmap XiHuaBitMap(Bitmap bitImage)1723         {1724             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1725             bit = XiHua.Xihua(bit, XiHua.array);1726             return bit;1727         }1728         #endregion1729 1730         #region 膨胀1731         /// <summary>1732         /// 功能描述:膨胀1733         /// 作  者:huangzh1734         /// 创建日期:2016-09-01 16:08:211735         /// 任务编号:1736         /// </summary>1737         /// <param name="bitImage">bitImage</param>1738         /// <returns>返回值</returns>1739         private Bitmap PangZhang(Bitmap bitImage)1740         {1741             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1742             Dilatation filter = new Dilatation();1743             // apply the filter1744             bit = filter.Apply(bit);1745             return bit;1746         }1747         #endregion1748 1749         #region 倒影分割1750 1751         /// <summary>1752         /// 功能描述:获取图片投影分割1753         /// 作  者:huangzh1754         /// 创建日期:2016-09-09 12:20:541755         /// 任务编号:1756         /// </summary>1757         /// <param name="bitImage">bitImage</param>1758         /// <param name="bitBase">bitBase</param>1759         /// <param name="intRemove">1/2</param>1760         /// <returns>返回值</returns>1761         private List<Bitmap> GetTouYingImages(Bitmap bitImage, Bitmap bitBase, int intRemove = 2)1762         {1763             Bitmap bit = bitImage.Clone(new Rectangle(0, 0, bitImage.Width, bitImage.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);1764             bool blnCheckDG = bool.Parse(m_xml.ConvertIdToName("61", "false"));1765             int intMaxDG = int.Parse(m_xml.ConvertIdToName("62", "3"));1766             bool blnCheckWidth = bool.Parse(m_xml.ConvertIdToName("63", "false"));1767             int intMaxWidth = int.Parse(m_xml.ConvertIdToName("64", "25"));1768 1769             HorizontalIntensityStatistics his = new HorizontalIntensityStatistics(bit);1770             Histogram histogram = his.Blue;1771             List<Rectangle> lstRects = new List<Rectangle>();1772             int intWidth = bit.Width;1773             int intHeight = bit.Height;1774             bool blnHasValue = http://www.mamicode.com/false;1775             int intStartX = 0, intEndx = 0;1776             for (int i = 0; i < histogram.Values.Length; i++)1777             {1778                 if (histogram.Values[i] == 0 || (blnCheckDG && histogram.Values[i] <= intMaxDG * 256))1779                 {1780                     if (blnHasValue)1781                     {1782                         intEndx = i;1783                         blnHasValue = http://www.mamicode.com/false;1784                         lstRects.Add(new Rectangle(intStartX, 0, intEndx - intStartX, intHeight));1785                     }1786                 }1787                 else1788                 {1789                     if (!blnHasValue)1790                     {1791                         intStartX = i;1792                         blnHasValue = http://www.mamicode.com/true;1793                     }1794                 }1795             }1796             if (blnHasValue)1797             {1798                 lstRects.Add(new Rectangle(intStartX, 0, intWidth - intStartX, intHeight));1799             }1800 1801             Dictionary<Bitmap, Rectangle> lstBits = new Dictionary<Bitmap, Rectangle>();1802             lstRects.ForEach(item => lstBits.Add(bit.Clone(item, System.Drawing.Imaging.PixelFormat.Format24bppRgb), item));1803 1804             //特殊处理,移除最后2个1805             List<Bitmap> lstKeys = lstBits.Keys.ToList();1806             bool blnChaoKuan1 = false;1807             if (lstKeys[lstKeys.Count - 1].Width > intMaxWidth - 5)1808                 blnChaoKuan1 = true;1809             if (lstKeys[lstKeys.Count - 1].Width > 2 * intMaxWidth)1810                 intRemove = 1;1811             lstBits.Remove(lstKeys[lstKeys.Count - 1]);1812             if (intRemove == 2)1813             {1814                 bool blnChaoKuan2 = false;1815                 if (lstKeys[lstKeys.Count - 2].Width > intMaxWidth - 5)1816                     blnChaoKuan2 = true;1817                 if (!(blnChaoKuan1 && blnChaoKuan2))1818                     lstBits.Remove(lstKeys[lstKeys.Count - 2]);1819             }1820 1821             List<Bitmap> lstImages = new List<Bitmap>();1822             if (blnCheckWidth)1823             {1824                 foreach (var item in lstBits)1825                 {1826                     if (item.Key.Width >= intMaxWidth)1827                     {1828                         int intColorCount = 0;1829                         Bitmap bitNew = HuiFuColorByImage(item.Key, bitBase, item.Value, ref intColorCount);1830                         int intSpliteNum = bitNew.Width / intMaxWidth + ((bitNew.Width % intMaxWidth) > 0 ? 1 : 0);1831 1832                         Bitmap[] images = ImageJuLei(bitNew, intSpliteNum, intColorCount);1833 1834                         //去噪1835 1836 1837                         List<Bitmap> lstImageNew = ImageOrder(images);1838                         foreach (var itemImage in lstImageNew)1839                         {1840                             lstImages.Add(GetMinBitmap(ColorFanZhuan(itemImage)));//需要做去噪1841                         }1842                     }1843                     else1844                     {1845                         lstImages.Add(GetMinBitmap(ColorFanZhuan(item.Key)));//需要做去噪1846                     }1847                 }1848             }1849 1850 1851             List<Bitmap> lstReturn = new List<Bitmap>();1852 1853             foreach (var item in lstImages)1854             {1855                 Bitmap bitItem = item;1856                 bitItem = ToResizeAndCenter(bitItem);1857                 if (bitItem.Width > 25 || bitItem.Height > 25)1858                 {1859                     bitItem = new Bitmap(bitItem, new Size(25, 25));1860                 }1861                 lstReturn.Add(bitItem);//添加图片    1862             }1863 1864             return lstReturn;1865         }1866 1867 1868         /// <summary>1869         /// 功能描述:图片排序1870         /// 作  者:huangzh1871         /// 创建日期:2016-09-08 17:44:211872         /// 任务编号:1873         /// </summary>1874         /// <param name="images">images</param>1875         /// <returns>返回值</returns>1876         private List<Bitmap> ImageOrder(Bitmap[] images)1877         {1878             Dictionary<int, int> lst = new Dictionary<int, int>();1879 1880             for (int m = 0; m < images.Length; m++)1881             {1882                 Bitmap bit = images[m];1883                 int intWidth = bit.Width;1884                 int intHeight = bit.Height;1885                 bool blnBreak = false;1886                 int intMinX = 0;1887                 for (int i = 0; i < intWidth; i++)1888                 {1889                     for (int j = 0; j < intHeight; j++)1890                     {1891                         Color c = bit.GetPixel(i, j);1892                         if (c.Name == "ffffffff")1893                         {1894                             blnBreak = true;1895                             intMinX = i;1896                             break;1897                         }1898                     }1899                     if (blnBreak)1900                         break;1901                 }1902                 lst.Add(m, intMinX);1903             }1904 1905             Dictionary<int, int> lstNew = (from d in lst1906                                            orderby d.Value1907                                            select d).ToDictionary(k => k.Key, v => v.Value);1908             List<Bitmap> lstImage = new List<Bitmap>();1909             foreach (var item in lstNew)1910             {1911                 lstImage.Add(images[item.Key]);1912             }1913             return lstImage;1914         }1915 1916         /// <summary>1917         /// 功能描述:恢复图片原色1918         /// 作  者:huangzh1919         /// 创建日期:2016-09-08 17:44:101920         /// 任务编号:1921         /// </summary>1922         /// <param name="bitImage">bitImage</param>1923         /// <param name="bitSource">bitSource</param>1924         /// <param name="rect">rect</param>1925         /// <param name="intColorCount">intColorCount</param>1926         /// <returns>返回值</returns>1927         private Bitmap HuiFuColorByImage(1928             Bitmap bitImage,1929             Bitmap bitSource,1930             Rectangle rect,1931             ref int intColorCount)1932         {1933             intColorCount = 0;1934             int intWidth = bitImage.Width;1935             int intHeight = bitImage.Height;1936             for (int i = 0; i < intWidth; i++)1937             {1938                 for (int j = 0; j < intHeight; j++)1939                 {1940                     Color c = bitImage.GetPixel(i, j);1941                     if (c.Name == "ffffffff")1942                     {1943                         intColorCount++;1944                         bitImage.SetPixel(i, j, bitSource.GetPixel(i + rect.X, j + rect.Y));1945                     }1946                 }1947             }1948             return bitImage;1949         }1950 1951 1952         /// <summary>1953         /// 功能描述:颜色聚类分割图片1954         /// 作  者:huangzh1955         /// 创建日期:2016-09-08 17:43:581956         /// 任务编号:1957         /// </summary>1958         /// <param name="bit">bit</param>1959         /// <param name="intNum">intNum</param>1960         /// <param name="intColorCount">intColorCount</param>1961         /// <returns>返回值</returns>1962         private Bitmap[] ImageJuLei(Bitmap bit, int intNum, int intColorCount)1963         {1964             Color[] colors;1965             List<Color> _lst = new List<Color>();1966             int intWidth = bit.Width;1967             int intHeight = bit.Height;1968             int intColorIndex = 0;1969             for (int i = 0; i < intWidth; i++)1970             {1971                 for (int j = 0; j < intHeight; j++)1972                 {1973                     Color c = bit.GetPixel(i, j);1974                     if (c.R != 0 && c.G != 0 && c.B != 0)1975                     {1976                         _lst.Add(c);1977                         intColorIndex++;1978                     }1979                 }1980             }1981             colors = _lst.ToArray();1982             int k = intNum;1983             Color[][] g;1984             g = KmeansColor.cluster(colors, k);1985             List<List<Color>> lstColors = new List<List<Color>>();1986 1987             foreach (var item in g)1988             {1989                 List<Color> lst = new List<Color>();1990                 foreach (var item1 in item)1991                 {1992                     Color c = item1;1993 1994                     if (!lst.Contains(c))1995                     {1996                         lst.Add(c);1997                     }1998                 }1999                 lstColors.Add(lst);2000             }2001 2002             Bitmap[] bits = new Bitmap[intNum];2003             for (int m = 0; m < lstColors.Count; m++)2004             {2005                 List<Color> lst = lstColors[m];2006                 Bitmap bitNew = bit.Clone(new Rectangle(0, 0, bit.Width, bit.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);2007                 int intWidthNew = bitNew.Width;2008                 int intHeightNew = bitNew.Height;2009                 for (int i = 0; i < intWidthNew; i++)2010                 {2011                     for (int j = 0; j < intHeightNew; j++)2012                     {2013                         Color cNew = bitNew.GetPixel(i, j);2014                         if (cNew.R != 0 && cNew.G != 0 && cNew.B != 0)2015                         {2016                             if (!lst.Contains(cNew))2017                             {2018                                 bitNew.SetPixel(i, j, Color.Black);2019                             }2020                             else2021                             {2022                                 bitNew.SetPixel(i, j, Color.White);2023                             }2024                         }2025                     }2026                 }2027                 bitNew = QuZao(bitNew);2028                 bits[m] = bitNew;2029             }2030 2031             return bits;2032         }2033 2034         #endregion2035 2036         private static class XiHua2037         {2038             public static int[] array = {0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,2039                                       1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,2040                                       0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,2041                                       1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,2042                                       1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2043                                       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2044                                       1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,2045                                       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2046                                       0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,2047                                       1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,2048                                       0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,2049                                       1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,2050                                       1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2051                                       1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,2052                                       1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,0,2053                                       1,1,0,0,1,1,1,0,1,1,0,0,1,0,0,0};2054 2055             public static bool isWhite(Color color)2056             {2057                 if (color.R + color.G + color.B > 400)2058                 {2059                     return true;2060                 }2061                 return false;2062             }2063 2064             public static Bitmap VThin(Bitmap image, int[] array)2065             {2066                 int h = image.Height;2067                 int w = image.Width;2068                 int NEXT = 1;2069                 for (int i = 0; i < h; i++)2070                 {2071                     for (int j = 0; j < w; j++)2072                     {2073                         if (NEXT == 0)2074                         {2075                             NEXT = 1;2076                         }2077                         else2078                         {2079                             int M;2080                             if (0 < j && j < w - 1)2081                             {2082                                 if (isBlack(image.GetPixel(j - 1, i)) && isBlack(image.GetPixel(j, i)) && isBlack(image.GetPixel(j + 1, i)))2083                                 {    // 三个点都为黑色的时候M=0,否则M=12084                                     M = 0;2085                                 }2086                                 else2087                                 {2088                                     M = 1;2089                                 }2090                             }2091                             else2092                             {2093                                 M = 1;2094                             }2095                             if (isBlack(image.GetPixel(j, i)) && M != 0)2096                             {2097                                 int[] a = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };2098                                 for (int k = 0; k < 3; k++)2099                                 {2100                                     for (int l = 0; l < 3; l++)2101                                     {2102                                         if ((-1 < (i - 1 + k) && (i - 1 + k) < h) && (-1 < (j - 1 + l) && (j - 1 + l) < w) && isWhite(image.GetPixel(j - 1 + l, i - 1 + k)))2103                                         {2104                                             a[k * 3 + l] = 1;2105                                         }2106                                     }2107                                 }2108                                 int sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128;2109                                 if (array[sum] == 0)2110                                 {2111                                     image.SetPixel(j, i, Color.Black);2112                                 }2113                                 else2114                                 {2115                                     image.SetPixel(j, i, Color.White);2116                                 }2117                                 if (array[sum] == 1)2118                                 {2119                                     NEXT = 0;2120                                 }2121                             }2122                         }2123                     }2124                 }2125                 return image;2126             }2127 2128             public static Bitmap HThin(Bitmap image, int[] array)2129             {2130                 int h = image.Height;2131                 int w = image.Width;2132                 int NEXT = 1;2133                 for (int j = 0; j < w; j++)2134                 {2135                     for (int i = 0; i < h; i++)2136                     {2137                         if (NEXT == 0)2138                         {2139                             NEXT = 1;2140                         }2141                         else2142                         {2143                             int M;2144                             if (0 < i && i < h - 1)2145                             {2146                                 if (isBlack(image.GetPixel(j, i - 1)) && isBlack(image.GetPixel(j, i)) && isBlack(image.GetPixel(j, i + 1)))2147                                 {2148                                     M = 0;2149                                 }2150                                 else2151                                 {2152                                     M = 1;2153                                 }2154                             }2155                             else2156                             {2157                                 M = 1;2158                             }2159                             if (isBlack(image.GetPixel(j, i)) && M != 0)2160                             {2161                                 int[] a = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };2162                                 for (int k = 0; k < 3; k++)2163                                 {2164                                     for (int l = 0; l < 3; l++)2165                                     {2166                                         if ((-1 < (i - 1 + k) && (i - 1 + k) < h) && (-1 < (j - 1 + l) && (j - 1 + l) < w) && isWhite(image.GetPixel(j - 1 + l, i - 1 + k)))2167                                         {2168                                             a[k * 3 + l] = 1;2169                                         }2170                                     }2171                                 }2172                                 int sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128;2173                                 if (array[sum] == 0)2174                                 {2175                                     image.SetPixel(j, i, Color.Black);2176                                 }2177                                 else2178                                 {2179                                     image.SetPixel(j, i, Color.White);2180                                 }2181                                 if (array[sum] == 1)2182                                 {2183                                     NEXT = 0;2184                                 }2185                             }2186                         }2187                     }2188                 }2189                 return image;2190             }2191 2192             public static Bitmap Xihua(Bitmap image, int[] array)2193             {2194                 image = image.Clone(new Rectangle(0, 0, image.Width, image.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);2195                 int num = 10;2196                 Bitmap iXihua = image;2197                 for (int i = 0; i < num; i++)2198                 {2199                     VThin(iXihua, array);2200                     HThin(iXihua, array);2201                 }2202                 return iXihua;2203             }2204 2205 2206             public static bool isBlack(Color color)2207             {2208                 if (color.R + color.G + color.B <= 600)2209                 {2210                     return true;2211                 }2212                 return false;2213             }2214 2215         }2216     }2217 }
View Code

 

备忘

验证码常用函数备忘