C# 识别验证码 包含工程项目

2015-02-04 来源:网络 点击:253

主要原理就是识别图片的颜色不同从而转换为文字。不过对于不规则的验证码就不太行了。
主要代码如下:

  1. recordString = string.Empty;  
  2.   
  3.  IHTMLControlRange imgRange;  
  4.   
  5.  IHTMLDocument2 document = new HTMLDocumentClass();  
  6.   
  7.  document = (IHTMLDocument2)this.axWebBrowser.Document;  
  8.   
  9.  HTMLBody body = (HTMLBody)document.body;  
  10.   
  11.  Bitmap bmp = new Bitmap(50, 20);  
  12.   
  13.  foreach (IHTMLImgElement imageElement in document.images)  
  14.  {  
  15.      if (imageElement.src.IndexOf("suijitupian") > -1)  
  16.      {  
  17.          imgRange = (IHTMLControlRange)body.createControlRange();  
  18.   
  19.          imgRange.add((IHTMLControlElement)imageElement);  
  20.   
  21.          imgRange.execCommand("Copy"falsenull);  
  22.   
  23.          bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);  
  24.   
  25.          bmp.Save(@"now.bmp");  
  26.      }  
  27.  }  
  28.   
  29.  this.EraseNoiseDotAndGray(bmp);  
  30.   
  31.  this.pictureBox1.Image = bmp;  
  32.   
  33.  bmp.Save(@"now_no_noise_dot.bmp");  
  34.   
  35.  //从左向右一列一列扫描,寻找四个数字的左右边界以切割  
  36.  int verticalBlackContent = 0;  
  37.   
  38.  int width = 0;  
  39.    
  40.  int currentNumberIndex = 0;  
  41.   
  42.  int[,] horizonAxisArray = new int[4,2];  
  43.   
  44.  //左右边界初始化  
  45.  for (int i = 0; i < 4; i++)  
  46.  {  
  47.      for (int j = 0; j < 2; j++)  
  48.      {  
  49.          horizonAxisArray[i, j] = 0;  
  50.      }  
  51.  }  
  52.  while (currentNumberIndex <= 3 && width < 50)  
  53.  {  
  54.      for (int h = 8; h < 18; h++)  
  55.      {  
  56.          if (bmp.GetPixel(width, h).ToArgb() == Color.Black.ToArgb())  
  57.          {  
  58.              verticalBlackContent++;  
  59.          }  
  60.      }  
  61.   
  62.      if (horizonAxisArray[currentNumberIndex, 0] == 0 && verticalBlackContent > 0) //左边界  
  63.      {  
  64.          horizonAxisArray[currentNumberIndex, 0] = width;  
  65.      }  
  66.      else if (horizonAxisArray[currentNumberIndex, 0] != 0 && horizonAxisArray[currentNumberIndex, 1] == 0 && verticalBlackContent == 0) //右边界  
  67.      {  
  68.          horizonAxisArray[currentNumberIndex++, 1] = width - 1;  
  69.      }  
  70.   
  71.      width = width + 1;  
  72.   
  73.      verticalBlackContent = 0;  
  74.  }  
  75.   
  76.  int[] tNumArr = new int[4]; //识别后的4个数字  
  77.   
  78.  //加载10个标准数字  
  79.  Bitmap[] sNumArr = new Bitmap[10];  
  80.   
  81.  for (int i = 0; i < 10; i++)  
  82.  {  
  83.      sNumArr[i] = new Bitmap(@"s" + i + ".bmp");  
  84.  }  
  85.   
  86.  //分割出来的4个数字分别与等宽的标准数字相匹配  
  87.  for (int i = 0; i < 4; i++)  
  88.  {  
  89.      int maxMatch = 0;  
  90.   
  91.      Bitmap cutNum = bmp.Clone(new Rectangle(horizonAxisArray[i, 0], 8, horizonAxisArray[i, 1] - horizonAxisArray[i, 0] + 1, 10), PixelFormat.Format24bppRgb);  
  92.   
  93.      for (int s = 0; s < 10; s++)  
  94.      {  
  95.          if (cutNum.Width == sNumArr[s].Width) //等宽则匹配  
  96.          {  
  97.              int curMatch = 0;  
  98.   
  99.              for (int j = 0; j < cutNum.Width; j++)  
  100.              {  
  101.                  for (int k = 0; k < 10; k++)  
  102.                  {  
  103.                      if (cutNum.GetPixel(j, k).ToArgb() == sNumArr[s].GetPixel(j, k).ToArgb() &&  
  104.   
  105.                          cutNum.GetPixel(j, k).ToArgb() == Color.Black.ToArgb() &&  
  106.   
  107.                          sNumArr[s].GetPixel(j, k).ToArgb() == Color.Black.ToArgb())  
  108.                      {  
  109.                          curMatch++;  
  110.                      }  
  111.                  }  
  112.              }  
  113.              if (curMatch > maxMatch)  
  114.              {  
  115.                  maxMatch = curMatch;  
  116.   
  117.                  tNumArr[i] = s;  
  118.              }  
  119.          }  
  120.      }  
  121.      recordString += tNumArr[i] + "";  
  122.  }  
  123.   
  124.  this.richTextBox1.Text = recordString;  

 

  1. private void EraseNoiseDotAndGray(Bitmap bmp)  
  2.  {  
  3.      for (int w = 0; w < 50; w++)  
  4.      {  
  5.          for (int h = 0; h < 20; h++)  
  6.          {  
  7.              if (bmp.GetPixel(w, h).R == 204) //为杂点,变为白色  
  8.              {  
  9.                  bmp.SetPixel(w, h, Color.White);  
  10.              }  
  11.              else if (bmp.GetPixel(w, h).G != 255) //为数字所在点,变为黑色  
  12.              {  
  13.                  bmp.SetPixel(w, h, Color.Black);  
  14.              }  
  15.          }  
  16.      }  
  17.  }  

 这里用了AxWebBrowser控件,结果老是加不到工具栏中去,所以只好手动写了个初始化,然后加到Desinge里。

  1. private AxWebBrowser axWebBrowser = null;  
  2.   
  3. private void InitialAxWebBrowser()  
  4. {  
  5.     System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VCCMainForm));  
  6.   
  7.     this.axWebBrowser = new AxSHDocVw.AxWebBrowser();  
  8.   
  9.     ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser)).BeginInit();  
  10.   
  11.     this.axWebBrowser.Dock = System.Windows.Forms.DockStyle.Bottom;  
  12.   
  13.     this.axWebBrowser.Enabled = true;  
  14.   
  15.     this.axWebBrowser.Location = new System.Drawing.Point(0, 225);  
  16.   
  17.     this.axWebBrowser.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWebBrowser.OcxState")));  
  18.   
  19.     this.axWebBrowser.Size = new System.Drawing.Size(592, 212);  
  20.   
  21.     this.axWebBrowser.TabIndex = 0;  
  22.   
  23.     this.axWebBrowser.ProgressChange += new DWebBrowserEvents2_ProgressChangeEventHandler(axWebBrowser_ProgressChange);  
  24.   
  25.     this.axWebBrowser.StatusTextChange += new DWebBrowserEvents2_StatusTextChangeEventHandler(axWebBrowser_StatusTextChange);  
  26.   
  27.     this.axWebBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(axWebBrowser_DocumentComplete);  
  28.   
  29.     this.Controls.Add(this.axWebBrowser);  
  30. }  

结果如下:


 
 详细工程:http://download.csdn.net/detail/yysyangyangyangshan/4233915

网络
Tag:
分享: