亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么實現驗證碼圖片識別功能

發布時間:2021-08-25 17:14:20 來源:億速云 閱讀:173 作者:chen 欄目:編程語言

這篇文章主要講解了“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.  

  9. namespaceBallotAiying2  

  10. {  

  11. classUnCodebase  

  12. {  

  13. publicBitmapbmpobj;  

  14. publicUnCodebase(Bitmappic)  

  15. {  

  16. bmpobj=newBitmap(pic);//轉換為Format32bppRgb  

  17. }  

  18.  

  19. /**////<summary> 

  20. ///根據RGB,計算灰度值  

  21. ///</summary> 

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

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

  24. privateintGetGrayNumColor(System.Drawing.ColorposClr)  

  25. {  

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

  27. }  

  28.  

  29. /**////<summary> 

  30. ///灰度轉換,逐點方式  

  31. ///</summary> 

  32. publicvoidGrayByPixels()  

  33. {  

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

  35. {  

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

  37. {  

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

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

  40. }  

  41. }  

  42. }  

  43. /**////<summary> 

  44. ///去圖形邊框  

  45. ///</summary> 

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

  47. publicvoidClearPicBorder(intborderWidth)  

  48. {  

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

  50. {  

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

  52. {  

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

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

  55. }  

  56. }  

  57. }  

  58.  

  59. /**////<summary> 

  60. ///灰度轉換,逐行方式  

  61. ///</summary> 

  62. publicvoidGrayByLine()  

  63. {  

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

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

  66. //bmpData.PixelFormat=PixelFormat.Format24bppRgb;  

  67. IntPtrscan0=bmpData.Scan0;  

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

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

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

  71.  

  72. //對圖片進行處理  

  73. intGrayValue=0;  

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

  75. {  

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

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

  78. }  

  79.  

  80. bmpobj.UnlockBits(bmpData);  

  81. }  

  82.  

  83. /**////<summary> 

  84. ///得到有效圖形并調整為可平均分割的大小  

  85. ///</summary> 

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

  87. ///<paramnameparamname="CharsCount">有效字符數</param> 

  88. ///<returns></returns> 

  89. publicvoidGetPicValidByValue(intdgGrayValue,intCharsCount)  

  90. {  

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

  92. intposx2=0;intposy2=0;  

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

  94. {  

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

  96. {  

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

  98. if(pixelValue<dgGrayValue)//根據灰度值  

  99. {  

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

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

  102.  

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

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

  105. };  

  106. };  

  107. };  

  108. //確保能整除  

  109. intSpan=CharsCount-(posx2-posx1+1)%CharsCount;//可整除的差額數  

  110. if(Span<CharsCount)  

  111. {  

  112. intleftSpan=Span/2;//分配到左邊的空列,如span為單數,則右邊比左邊大1  

  113. if(posx1>leftSpan)  

  114. posx1posx1=posx1-leftSpan;  

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

  116. posx2posx2=posx2+Span-leftSpan;  

  117. }  

  118. //復制新圖  

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

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

  121. }  

  122.  

  123. /**////<summary> 

  124. ///得到有效圖形,圖形為類變量  

  125. ///</summary> 

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

  127. ///<paramnameparamname="CharsCount">有效字符數</param> 

  128. ///<returns></returns> 

  129. publicvoidGetPicValidByValue(intdgGrayValue)  

  130. {  

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

  132. intposx2=0;intposy2=0;  

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

  134. {  

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

  136. {  

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

  138. if(pixelValue<dgGrayValue)//根據灰度值  

  139. {  

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

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

  142.  

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

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

  145. };  

  146. };  

  147. };  

  148. //復制新圖  

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

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

  151. }  

  152.  

  153. /**////<summary> 

  154. ///得到有效圖形,圖形由外面傳入  

  155. ///</summary> 

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

  157. ///<paramnameparamname="CharsCount">有效字符數</param> 

  158. ///<returns></returns> 

  159. publicBitmapGetPicValidByValue(Bitmapsinglepic,intdgGrayValue)  

  160. {  

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

  162. intposx2=0;intposy2=0;  

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

  164. {  

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

  166. {  

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

  168. if(pixelValue<dgGrayValue)//根據灰度值  

  169. {  

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

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

  172.  

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

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

  175. };  

  176. };  

  177. };  

  178. //復制新圖  

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

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

  181. }  

  182.  

  183. /**////<summary> 

  184. ///平均分割圖片  

  185. ///</summary> 

  186. ///<paramnameparamname="RowNum">水平上分割數</param> 

  187. ///<paramnameparamname="ColNum">垂直上分割數</param> 

  188. ///<returns>分割好的圖片數組</returns> 

  189. publicBitmap[]GetSplitPics(intRowNum,intColNum)  

  190. {  

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

  192. returnnull;  

  193. intsingW=bmpobj.Width/RowNum;  

  194. intsingH=bmpobj.Height/ColNum;  

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

  196.  

  197. RectanglecloneRect;  

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

  199. {  

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

  201. {  

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

  203. PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);//復制小塊圖  

  204. }  

  205. }  

  206. returnPicArray;  

  207. }  

  208.  

  209. /**////<summary> 

  210. ///返回灰度圖片的點陣描述字串,1表示灰點,0表示背景  

  211. ///</summary> 

  212. ///<paramnameparamname="singlepic">灰度圖</param> 

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

  214. ///<returns></returns> 

  215. publicstringGetSingleBmpCode(Bitmapsinglepic,intdgGrayValue)  

  216. {  

  217. Colorpiexl;  

  218. stringcode="";  

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

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

  221. {  

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

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

  224. codecode=code+"1";  

  225. else  

  226. codecode=code+"0";  

  227. }  

  228. returncode;  

  229. }  

  230. }  

感謝各位的閱讀,以上就是“C#怎么實現驗證碼圖片識別功能”的內容了,經過本文的學習后,相信大家對C#怎么實現驗證碼圖片識別功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清涧县| 杂多县| 资阳市| 南召县| 方城县| 宁远县| 夏邑县| 浑源县| 丹寨县| 淮安市| 湛江市| 琼中| 舞钢市| 浮山县| 防城港市| 交口县| 东宁县| 民乐县| 巴彦淖尔市| 肇源县| 原阳县| 自贡市| 陇南市| 镇江市| 仙游县| 临清市| 会昌县| 舒城县| 兴和县| 运城市| 玛曲县| 屯昌县| 聂拉木县| 神农架林区| 曲靖市| 广元市| 广德县| 靖宇县| 商南县| 夏津县| 瓮安县|