首页 > 代码库 > 验证码常用函数备忘
验证码常用函数备忘
颜色聚类
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 }
常用函数
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 }
备忘
验证码常用函数备忘
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。