国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

c#實現識別圖片上的驗證碼數字

2019-10-29 21:36:27
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了c#實現識別圖片上的驗證碼數字的方法,本文給大家匯總了2種方法,有需要的小伙伴可以參考下。

c#實現識別圖片上的驗證碼數字

 

 
  1. public void imgdo(Bitmap img) 
  2. //去色 
  3. Bitmap btp = img; 
  4. Color c = new Color(); 
  5. int rr, gg, bb; 
  6. for (int i = 0; i < btp.Width; i++) 
  7. for (int j = 0; j < btp.Height; j++) 
  8. //取圖片當前的像素點 
  9. c = btp.GetPixel(i, j); 
  10. rr = c.R; gg = c.G; bb = c.B; 
  11. //改變顏色 
  12. if (rr == 102 && gg == 0 && bb == 0) 
  13. //重新設置當前的像素點 
  14. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  15. if (rr == 153 && gg == 0 && bb == 0) 
  16. //重新設置當前的像素點 
  17. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  18. if (rr == 153 && gg == 0 && bb == 51) 
  19. //重新設置當前的像素點 
  20. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  21. if (rr == 153 && gg == 43 && bb == 51) 
  22. //重新設置當前的像素點 
  23. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  24. if (rr == 255 && gg == 255 && bb == 0) 
  25. //重新設置當前的像素點 
  26. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  27. if (rr == 255 && gg == 255 && bb == 51) 
  28. //重新設置當前的像素點 
  29. btp.SetPixel(i, j, Color.FromArgb(255, 255, 255, 255)); 
  30. btp.Save("d://去除相關顏色.png"); 
  31.  
  32. pictureBox2.Image = Image.FromFile("d://去除相關顏色.png"); 
  33.  
  34.  
  35. //灰度 
  36. Bitmap bmphd = btp; 
  37. for (int i = 0; i < bmphd.Width; i++) 
  38. for (int j = 0; j < bmphd.Height; j++) 
  39. //取圖片當前的像素點 
  40. var color = bmphd.GetPixel(i, j); 
  41.  
  42. var gray = (int)(color.R * 0.001 + color.G * 0.700 + color.B * 0.250); 
  43.  
  44. //重新設置當前的像素點 
  45. bmphd.SetPixel(i, j, Color.FromArgb(gray, gray, gray)); 
  46. bmphd.Save("d://灰度.png"); 
  47. pictureBox27.Image = Image.FromFile("d://灰度.png"); 
  48.  
  49.  
  50. //二值化 
  51. Bitmap erzhi = bmphd; 
  52. Bitmap orcbmp; 
  53. int nn = 3; 
  54. int w = erzhi.Width; 
  55. int h = erzhi.Height; 
  56. BitmapData data = erzhi.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
  57. unsafe 
  58. byte* p = (byte*)data.Scan0; 
  59. byte[,] vSource = new byte[w, h]; 
  60. int offset = data.Stride - w * nn; 
  61.  
  62. for (int y = 0; y < h; y++) 
  63. for (int x = 0; x < w; x++) 
  64. vSource[x, y] = (byte)(((int)p[0] + (int)p[1] + (int)p[2]) / 3); 
  65. p += nn; 
  66. p += offset; 
  67. erzhi.UnlockBits(data); 
  68.  
  69. Bitmap bmpDest = new Bitmap(w, h, PixelFormat.Format24bppRgb); 
  70. BitmapData dataDest = bmpDest.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); 
  71. p = (byte*)dataDest.Scan0; 
  72. offset = dataDest.Stride - w * nn; 
  73. for (int y = 0; y < h; y++) 
  74. for (int x = 0; x < w; x++) 
  75. p[0] = p[1] = p[2] = (int)vSource[x, y] > 161 ? (byte)255 : (byte)0; 
  76. //p[0] = p[1] = p[2] = (int)GetAverageColor(vSource, x, y, w, h) > 50 ? (byte)255 : (byte)0; 
  77. p += nn; 
  78.  
  79. p += offset; 
  80. bmpDest.UnlockBits(dataDest); 
  81.  
  82. orcbmp = bmpDest; 
  83. orcbmp.Save("d://二值化.png"); 
  84. pictureBox29.Image = Image.FromFile("d://二值化.png"); 
  85.  
  86. //OCR的值 
  87. if (orcbmp != null
  88. string result = Ocr(orcbmp); 
  89. label32.Text = result.Replace("/n""/r/n").Replace(" """); 
  90.  

C#識別驗證碼圖片通用類

 

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Text; 
  4. using System.Collections; 
  5. using System.Drawing; 
  6. using System.Drawing.Imaging; 
  7. using System.Runtime.InteropServices; 
  8.  
  9. namespace BallotAiying2 
  10. class UnCodebase 
  11. public Bitmap bmpobj; 
  12. public UnCodebase(Bitmap pic) 
  13. bmpobj = new Bitmap(pic); //轉換為Format32bppRgb 
  14.  
  15. /// <summary> 
  16. /// 根據RGB,計算灰度值 
  17. /// </summary> 
  18. /// <param name="posClr">Color值</param> 
  19. /// <returns>灰度值,整型</returns> 
  20. private int GetGrayNumColor(System.Drawing.Color posClr) 
  21. return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16; 
  22.  
  23. /// <summary> 
  24. /// 灰度轉換,逐點方式 
  25. /// </summary> 
  26. public void GrayByPixels() 
  27. for (int i = 0; i < bmpobj.Height; i++) 
  28. for (int j = 0; j < bmpobj.Width; j++) 
  29. int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i)); 
  30. bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue)); 
  31.  
  32. /// <summary> 
  33. /// 去圖形邊框 
  34. /// </summary> 
  35. /// <param name="borderWidth"></param> 
  36. public void ClearPicBorder(int borderWidth) 
  37. for (int i = 0; i < bmpobj.Height; i++) 
  38. for (int j = 0; j < bmpobj.Width; j++) 
  39. if (i < borderWidth || j < borderWidth || j > bmpobj.Width - 1 - borderWidth || i > bmpobj.Height - 1 - borderWidth) 
  40. bmpobj.SetPixel(j, i, Color.FromArgb(255, 255, 255)); 
  41.  
  42. /// <summary> 
  43. /// 灰度轉換,逐行方式 
  44. /// </summary> 
  45. public void GrayByLine() 
  46. Rectangle rec = new Rectangle(0, 0, bmpobj.Width, bmpobj.Height); 
  47. BitmapData bmpData = bmpobj.LockBits(rec, ImageLockMode.ReadWrite, bmpobj.PixelFormat);// PixelFormat.Format32bppPArgb); 
  48. // bmpData.PixelFormat = PixelFormat.Format24bppRgb; 
  49. IntPtr scan0 = bmpData.Scan0; 
  50. int len = bmpobj.Width * bmpobj.Height; 
  51. int[] pixels = new int[len]; 
  52. Marshal.Copy(scan0, pixels, 0, len); 
  53.  
  54. //對圖片進行處理 
  55. int GrayValue = 0; 
  56. for (int i = 0; i < len; i++) 
  57. GrayValue = GetGrayNumColor(Color.FromArgb(pixels)); 
  58. pixels = (byte)(Color.FromArgb(GrayValue, GrayValue, GrayValue)).ToArgb(); //Color轉byte 
  59.  
  60. bmpobj.UnlockBits(bmpData); 
  61.  
  62. /// <summary> 
  63. /// 得到有效圖形并調整為可平均分割的大小 
  64. /// </summary> 
  65. /// <param name="dgGrayValue">灰度背景分界值</param> 
  66. /// <param name="CharsCount">有效字符數</param> 
  67. /// <returns></returns> 
  68. public void GetPicValidByValue(int dgGrayValue, int CharsCount) 
  69. int posx1 = bmpobj.Width; int posy1 = bmpobj.Height; 
  70. int posx2 = 0; int posy2 = 0; 
  71. for (int i = 0; i < bmpobj.Height; i++) //找有效區 
  72. for (int j = 0; j < bmpobj.Width; j++) 
  73. int pixelValue = bmpobj.GetPixel(j, i).R; 
  74. if (pixelValue < dgGrayValue) //根據灰度值 
  75. if (posx1 > j) posx1 = j; 
  76. if (posy1 > i) posy1 = i; 
  77.  
  78. if (posx2 < j) posx2 = j; 
  79. if (posy2 < i) posy2 = i; 
  80. }; 
  81. }; 
  82. }; 
  83. // 確保能整除 
  84. int Span = CharsCount - (posx2 - posx1 + 1) % CharsCount; //可整除的差額數 
  85. if (Span < CharsCount) 
  86. int leftSpan = Span / 2; //分配到左邊的空列 ,如span為單數,則右邊比左邊大1 
  87. if (posx1 > leftSpan) 
  88. posx1 = posx1 - leftSpan; 
  89. if (posx2 + Span - leftSpan < bmpobj.Width) 
  90. posx2 = posx2 + Span - leftSpan; 
  91. //復制新圖 
  92. Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); 
  93. bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat); 
  94.  
  95. /// <summary> 
  96. /// 得到有效圖形,圖形為類變量 
  97. /// </summary> 
  98. /// <param name="dgGrayValue">灰度背景分界值</param> 
  99. /// <param name="CharsCount">有效字符數</param> 
  100. /// <returns></returns> 
  101. public void GetPicValidByValue(int dgGrayValue) 
  102. int posx1 = bmpobj.Width; int posy1 = bmpobj.Height; 
  103. int posx2 = 0; int posy2 = 0; 
  104. for (int i = 0; i < bmpobj.Height; i++) //找有效區 
  105. for (int j = 0; j < bmpobj.Width; j++) 
  106. int pixelValue = bmpobj.GetPixel(j, i).R; 
  107. if (pixelValue < dgGrayValue) //根據灰度值 
  108. if (posx1 > j) posx1 = j; 
  109. if (posy1 > i) posy1 = i; 
  110.  
  111. if (posx2 < j) posx2 = j; 
  112. if (posy2 < i) posy2 = i; 
  113. }; 
  114. }; 
  115. }; 
  116. //復制新圖 
  117. Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); 
  118. bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat); 
  119.  
  120. /// <summary> 
  121. /// 得到有效圖形,圖形由外面傳入 
  122. /// </summary> 
  123. /// <param name="dgGrayValue">灰度背景分界值</param> 
  124. /// <param name="CharsCount">有效字符數</param> 
  125. /// <returns></returns> 
  126. public Bitmap GetPicValidByValue(Bitmap singlepic, int dgGrayValue) 
  127. int posx1 = singlepic.Width; int posy1 = singlepic.Height; 
  128. int posx2 = 0; int posy2 = 0; 
  129. for (int i = 0; i < singlepic.Height; i++) //找有效區 
  130. for (int j = 0; j < singlepic.Width; j++) 
  131. int pixelValue = singlepic.GetPixel(j, i).R; 
  132. if (pixelValue < dgGrayValue) //根據灰度值 
  133. if (posx1 > j) posx1 = j; 
  134. if (posy1 > i) posy1 = i; 
  135.  
  136. if (posx2 < j) posx2 = j; 
  137. if (posy2 < i) posy2 = i; 
  138. }; 
  139. }; 
  140. }; 
  141. //復制新圖 
  142. Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); 
  143. return singlepic.Clone(cloneRect, singlepic.PixelFormat); 
  144.  
  145. /// <summary> 
  146. /// 平均分割圖片 
  147. /// </summary> 
  148. /// <param name="RowNum">水平上分割數</param> 
  149. /// <param name="ColNum">垂直上分割數</param> 
  150. /// <returns>分割好的圖片數組</returns> 
  151. public Bitmap [] GetSplitPics(int RowNum,int ColNum) 
  152. if (RowNum == 0 || ColNum == 0) 
  153. return null
  154. int singW = bmpobj.Width / RowNum; 
  155. int singH = bmpobj.Height / ColNum; 
  156. Bitmap [] PicArray=new Bitmap[RowNum*ColNum]; 
  157.  
  158. Rectangle cloneRect; 
  159. for (int i = 0; i < ColNum; i++) //找有效區 
  160. for (int j = 0; j < RowNum; j++) 
  161. cloneRect = new Rectangle(j*singW, i*singH, singW , singH); 
  162. PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect, bmpobj.PixelFormat);//復制小塊圖 
  163. return PicArray; 
  164.  
  165. /// <summary> 
  166. /// 返回灰度圖片的點陣描述字串,1表示灰點,0表示背景 
  167. /// </summary> 
  168. /// <param name="singlepic">灰度圖</param> 
  169. /// <param name="dgGrayValue">背前景灰色界限</param> 
  170. /// <returns></returns> 
  171. public string GetSingleBmpCode(Bitmap singlepic, int dgGrayValue) 
  172. Color piexl; 
  173. string code = ""
  174. for (int posy = 0; posy < singlepic.Height; posy++) 
  175. for (int posx = 0; posx < singlepic.Width; posx++) 
  176. piexl = singlepic.GetPixel(posx, posy); 
  177. if (piexl.R < dgGrayValue) // Color.Black ) 
  178. code = code + "1"
  179. else 
  180. code = code + "0"
  181. return code; 

以上2則都是使用C#實現的orc識別的代碼,希望對大家學習C#有所幫助。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿瓦提县| 保定市| 清远市| 芦溪县| 水城县| 林甸县| 宁南县| 万州区| 潜江市| 日喀则市| 阿拉善右旗| 库车县| 稷山县| 牙克石市| 宝丰县| 涟源市| 凤山市| 萨迦县| 新平| 陇南市| 恩平市| 增城市| 四子王旗| 通江县| 达拉特旗| 通城县| 祥云县| 翼城县| 孟津县| 茂名市| 北流市| 凯里市| 固原市| 科技| 太保市| 海南省| 嘉峪关市| 内江市| 乌拉特后旗| 冷水江市| 屯留县|