主页 > 编程资料 > C# >
发布时间:2015-02-04 作者:网络 阅读:573次

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

  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

关键字词: