C#怎么实现验证码图片识别功能

发布时间:2021-08-25 17:14:20 作者:chen
阅读:206
开发者专用服务器限时活动,0元免费领! 查看>>

这篇文章主要讲解了“C#怎么实现验证码图片识别功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现验证码图片识别功能”吧!

封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,简单几句实现C#代码和验证码图片识别:

GrayByPixels();//灰度处理  GetPicValidByValue(128,4);//得到有效空间  Bitmap[]pics=GetSplitPics(4,1);//分割  stringcode=GetSingleBmpCode(pics[i],128);//得到代码串

具体使用,请参见我做的例子:

  1. usingSystem;  

  2. usingSystem.Collections.Generic;  

  3. usingSystem.Text;  

  4. usingSystem.Collections;  

  5. usingSystem.Drawing;  

  6. usingSystem.Drawing.Imaging;  

  7. usingSystem.Runtime.InteropServices;  

  8. namespaceBallotAiying2  

  9. {  

  10. classUnCodebase  

  11. {  

  12. publicBitmapbmpobj;  

  13. publicUnCodebase(Bitmappic)  

  14. {  

  15. bmpobj=newBitmap(pic);//转换为Format32bppRgb  

  16. }  

  17. /**////<summary> 

  18. ///根据RGB,计算灰度值  

  19. ///</summary> 

  20. ///<paramnameparamname="posClr">Color值</param> 

  21. ///<returns>灰度值,整型</returns> 

  22. privateintGetGrayNumColor(System.Drawing.ColorposClr)  

  23. {  

  24. return(posClr.R*19595+posClr.G*38469+posClr.B*7472)>>16;  

  25. }  

  26. /**////<summary> 

  27. ///灰度转换,逐点方式  

  28. ///</summary> 

  29. publicvoidGrayByPixels()  

  30. {  

  31. for(inti=0;i<bmpobj.Height;i++)  

  32. {  

  33. for(intj=0;j<bmpobj.Width;j++)  

  34. {  

  35. inttmpValue=GetGrayNumColor(bmpobj.GetPixel(j,i));  

  36. bmpobj.SetPixel(j,i,Color.FromArgb(tmpValue,tmpValue,tmpValue));  

  37. }  

  38. }  

  39. }  

  40. /**////<summary> 

  41. ///去图形边框  

  42. ///</summary> 

  43. ///<paramnameparamname="borderWidth"></param> 

  44. publicvoidClearPicBorder(intborderWidth)  

  45. {  

  46. for(inti=0;i<bmpobj.Height;i++)  

  47. {  

  48. for(intj=0;j<bmpobj.Width;j++)  

  49. {  

  50. if(i<borderWidth||j<borderWidth||j>bmpobj.
    Width-1-borderWidth||i>bmpobj.Height-1-borderWidth)  

  51. bmpobj.SetPixel(j,i,Color.FromArgb(255,255,255));  

  52. }  

  53. }  

  54. }  

  55. /**////<summary> 

  56. ///灰度转换,逐行方式  

  57. ///</summary> 

  58. publicvoidGrayByLine()  

  59. {  

  60. Rectanglerec=newRectangle(0,0,bmpobj.Width,bmpobj.Height);  

  61. BitmapDatabmpData=bmpobj.LockBits(rec,ImageLockMode.ReadWrite,bmpobj.PixelFormat);
    //PixelFormat.Format32bppPArgb);  

  62. //bmpData.PixelFormat=PixelFormat.Format24bppRgb;  

  63. IntPtrscan0=bmpData.Scan0;  

  64. intlen=bmpobj.Width*bmpobj.Height;  

  65. int[]pixels=newint[len];  

  66. Marshal.Copy(scan0,pixels,0,len);  

  67. //对图片进行处理  

  68. intGrayValue=0;  

  69. for(inti=0;i<len;i++)  

  70. {  

  71. GrayValue=GetGrayNumColor(Color.FromArgb(pixels[i]));  

  72. pixels[i]=(byte)(Color.FromArgb(GrayValue,GrayValue,GrayValue)).ToArgb();//Color转byte  

  73. }  

  74. bmpobj.UnlockBits(bmpData);  

  75. }  

  76. /**////<summary> 

  77. ///得到有效图形并调整为可平均分割的大小  

  78. ///</summary> 

  79. ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> 

  80. ///<paramnameparamname="CharsCount">有效字符数</param> 

  81. ///<returns></returns> 

  82. publicvoidGetPicValidByValue(intdgGrayValue,intCharsCount)  

  83. {  

  84. intposx1=bmpobj.Width;intposy1=bmpobj.Height;  

  85. intposx2=0;intposy2=0;  

  86. for(inti=0;i<bmpobj.Height;i++)//找有效区  

  87. {  

  88. for(intj=0;j<bmpobj.Width;j++)  

  89. {  

  90. intpixelValue=bmpobj.GetPixel(j,i).R;  

  91. if(pixelValue<dgGrayValue)//根据灰度值  

  92. {  

  93. if(posx1>j)posx1=j;  

  94. if(posy1>i)posy1=i;  

  95. if(posx2<j)posx2=j;  

  96. if(posy2<i)posy2=i;  

  97. };  

  98. };  

  99. };  

  100. //确保能整除  

  101. intSpan=CharsCount-(posx2-posx1+1)%CharsCount;//可整除的差额数  

  102. if(Span<CharsCount)  

  103. {  

  104. intleftSpan=Span/2;//分配到左边的空列,如span为单数,则右边比左边大1  

  105. if(posx1>leftSpan)  

  106. posx1posx1=posx1-leftSpan;  

  107. if(posx2+Span-leftSpan<bmpobj.Width)  

  108. posx2posx2=posx2+Span-leftSpan;  

  109. }  

  110. //复制新图  

  111. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  

  112. bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);  

  113. }  

  114. /**////<summary> 

  115. ///得到有效图形,图形为类变量  

  116. ///</summary> 

  117. ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> 

  118. ///<paramnameparamname="CharsCount">有效字符数</param> 

  119. ///<returns></returns> 

  120. publicvoidGetPicValidByValue(intdgGrayValue)  

  121. {  

  122. intposx1=bmpobj.Width;intposy1=bmpobj.Height;  

  123. intposx2=0;intposy2=0;  

  124. for(inti=0;i<bmpobj.Height;i++)//找有效区  

  125. {  

  126. for(intj=0;j<bmpobj.Width;j++)  

  127. {  

  128. intpixelValue=bmpobj.GetPixel(j,i).R;  

  129. if(pixelValue<dgGrayValue)//根据灰度值  

  130. {  

  131. if(posx1>j)posx1=j;  

  132. if(posy1>i)posy1=i;  

  133. if(posx2<j)posx2=j;  

  134. if(posy2<i)posy2=i;  

  135. };  

  136. };  

  137. };  

  138. //复制新图  

  139. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  

  140. bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);  

  141. }  

  142. /**////<summary> 

  143. ///得到有效图形,图形由外面传入  

  144. ///</summary> 

  145. ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> 

  146. ///<paramnameparamname="CharsCount">有效字符数</param> 

  147. ///<returns></returns> 

  148. publicBitmapGetPicValidByValue(Bitmapsinglepic,intdgGrayValue)  

  149. {  

  150. intposx1=singlepic.Width;intposy1=singlepic.Height;  

  151. intposx2=0;intposy2=0;  

  152. for(inti=0;i<singlepic.Height;i++)//找有效区  

  153. {  

  154. for(intj=0;j<singlepic.Width;j++)  

  155. {  

  156. intpixelValue=singlepic.GetPixel(j,i).R;  

  157. if(pixelValue<dgGrayValue)//根据灰度值  

  158. {  

  159. if(posx1>j)posx1=j;  

  160. if(posy1>i)posy1=i;  

  161. if(posx2<j)posx2=j;  

  162. if(posy2<i)posy2=i;  

  163. };  

  164. };  

  165. };  

  166. //复制新图  

  167. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  

  168. returnsinglepic.Clone(cloneRect,singlepic.PixelFormat);  

  169. }  

  170. /**////<summary> 

  171. ///平均分割图片  

  172. ///</summary> 

  173. ///<paramnameparamname="RowNum">水平上分割数</param> 

  174. ///<paramnameparamname="ColNum">垂直上分割数</param> 

  175. ///<returns>分割好的图片数组</returns> 

  176. publicBitmap[]GetSplitPics(intRowNum,intColNum)  

  177. {  

  178. if(RowNum==0||ColNum==0)  

  179. returnnull;  

  180. intsingW=bmpobj.Width/RowNum;  

  181. intsingH=bmpobj.Height/ColNum;  

  182. Bitmap[]PicArray=newBitmap[RowNum*ColNum];  

  183. RectanglecloneRect;  

  184. for(inti=0;i<ColNum;i++)//找有效区  

  185. {  

  186. for(intj=0;j<RowNum;j++)  

  187. {  

  188. cloneRect=newRectangle(j*singW,i*singH,singW,singH);  

  189. PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);//复制小块图  

  190. }  

  191. }  

  192. returnPicArray;  

  193. }  

  194. /**////<summary> 

  195. ///返回灰度图片的点阵描述字串,1表示灰点,0表示背景  

  196. ///</summary> 

  197. ///<paramnameparamname="singlepic">灰度图</param> 

  198. ///<paramnameparamname="dgGrayValue">背前景灰色界限</param> 

  199. ///<returns></returns> 

  200. publicstringGetSingleBmpCode(Bitmapsinglepic,intdgGrayValue)  

  201. {  

  202. Colorpiexl;  

  203. stringcode="";  

  204. for(intposy=0;posy<singlepic.Height;posy++)  

  205. for(intposx=0;posx<singlepic.Width;posx++)  

  206. {  

  207. piexl=singlepic.GetPixel(posx,posy);  

  208. if(piexl.R<dgGrayValue)//Color.Black)  

  209. codecode=code+"1";  

  210. else  

  211. codecode=code+"0";  

  212. }  

  213. returncode;  

  214. }  

  215. }  

感谢各位的阅读,以上就是“C#怎么实现验证码图片识别功能”的内容了,经过本文的学习后,相信大家对C#怎么实现验证码图片识别功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. 图片识别之验证码识别
  2. PHP实现验证码功能

开发者交流群:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:C#中二维数组的用法

下一篇:C#的枚举是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
开发者交流群×