自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

概述C#代碼和驗(yàn)證碼圖片

開發(fā) 后端
本文介紹C#代碼和驗(yàn)證碼圖片,盡管每個(gè)網(wǎng)站的驗(yàn)證碼圖片都不相同,識(shí)別的方法有所差別,簡(jiǎn)單幾句實(shí)現(xiàn)C#代碼和驗(yàn)證碼圖片識(shí)別。

最近寫了C#代碼和驗(yàn)證碼圖片自動(dòng)識(shí)別程序,盡管每個(gè)網(wǎng)站的驗(yàn)證碼圖片都不相同,識(shí)別的方法有所差別。但寫得多了,也總結(jié)出不少相同之處。今天抽空封裝出一個(gè)基礎(chǔ)類來,發(fā)現(xiàn)可以很好地重復(fù)利用,編寫不同的驗(yàn)證碼識(shí)別程序,效率提高了不少。好東東不能獨(dú)享,現(xiàn)放出來供大家共同研究,請(qǐng)網(wǎng)友們妥善用之。

封裝后的類使用很簡(jiǎn)單,針對(duì)不同的驗(yàn)證碼,相應(yīng)繼承修改某些方法,簡(jiǎn)單幾句實(shí)現(xiàn)C#代碼和驗(yàn)證碼圖片識(shí)別:

  1. GrayByPixels();//灰度處理  
  2. GetPicValidByValue(128,4);//得到有效空間  
  3. Bitmap[]pics=GetSplitPics(4,1);//分割  
  4. stringcode=GetSingleBmpCode(pics[i],128);//得到代碼串 

具體使用,請(qǐng)參見我做的例子:

  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);//轉(zhuǎn)換為Format32bppRgb  
  17. }  
  18.  
  19. /**////<summary> 
  20. ///根據(jù)RGB,計(jì)算灰度值  
  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. ///灰度轉(zhuǎn)換,逐點(diǎn)方式  
  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. ///灰度轉(zhuǎn)換,逐行方式  
  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. //對(duì)圖片進(jìn)行處理  
  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轉(zhuǎn)byte  
  78. }  
  79.  
  80. bmpobj.UnlockBits(bmpData);  
  81. }  
  82.  
  83. /**////<summary> 
  84. ///得到有效圖形并調(diào)整為可平均分割的大小  
  85. ///</summary> 
  86. ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> 
  87. ///<paramnameparamname="CharsCount">有效字符數(shù)</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++)//找有效區(qū)  
  94. {  
  95. for(intj=0;j<bmpobj.Width;j++)  
  96. {  
  97. intpixelValue=bmpobj.GetPixel(j,i).R;  
  98. if(pixelValue<dgGrayValue)//根據(jù)灰度值  
  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;//可整除的差額數(shù)  
  110. if(Span<CharsCount)  
  111. {  
  112. intleftSpan=Span/2;//分配到左邊的空列,如span為單數(shù),則右邊比左邊大1  
  113. if(posx1>leftSpan)  
  114. posx1posx1=posx1-leftSpan;  
  115. if(posx2+Span-leftSpan<bmpobj.Width)  
  116. posx2posx2=posx2+Span-leftSpan;  
  117. }  
  118. //復(fù)制新圖  
  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">有效字符數(shù)</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++)//找有效區(qū)  
  134. {  
  135. for(intj=0;j<bmpobj.Width;j++)  
  136. {  
  137. intpixelValue=bmpobj.GetPixel(j,i).R;  
  138. if(pixelValue<dgGrayValue)//根據(jù)灰度值  
  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. //復(fù)制新圖  
  149. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  
  150. bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);  
  151. }  
  152.  
  153. /**////<summary> 
  154. ///得到有效圖形,圖形由外面?zhèn)魅? 
  155. ///</summary> 
  156. ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> 
  157. ///<paramnameparamname="CharsCount">有效字符數(shù)</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++)//找有效區(qū)  
  164. {  
  165. for(intj=0;j<singlepic.Width;j++)  
  166. {  
  167. intpixelValue=singlepic.GetPixel(j,i).R;  
  168. if(pixelValue<dgGrayValue)//根據(jù)灰度值  
  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. //復(fù)制新圖  
  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">水平上分割數(shù)</param> 
  187. ///<paramnameparamname="ColNum">垂直上分割數(shù)</param> 
  188. ///<returns>分割好的圖片數(shù)組</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++)//找有效區(qū)  
  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);//復(fù)制小塊圖  
  204. }  
  205. }  
  206. returnPicArray;  
  207. }  
  208.  
  209. /**////<summary> 
  210. ///返回灰度圖片的點(diǎn)陣描述字串,1表示灰點(diǎn),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#代碼和驗(yàn)證碼圖片

【編輯推薦】

  1. 分析C#不安全代碼
  2. 淺析C#調(diào)用ImageAnimator
  3. C#連接Access、SQL Server數(shù)據(jù)庫
  4. 淺談C#固定的和活動(dòng)的變量
  5. 介紹C#中的值類型
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2009-08-13 10:47:29

C#創(chuàng)建驗(yàn)證碼

2009-08-12 11:05:00

2014-04-24 10:09:05

驗(yàn)證碼C#

2012-05-24 15:41:38

PHP

2024-01-29 08:32:10

Python驗(yàn)證碼識(shí)別

2023-10-27 08:53:13

Python驗(yàn)證碼圖片識(shí)別

2009-08-14 16:54:19

C# Hello Wo

2009-08-06 09:32:03

C#代碼協(xié)同執(zhí)行

2020-08-12 09:14:45

Python驗(yàn)證碼工具

2013-06-19 10:19:59

2021-08-11 09:51:24

人工智能機(jī)器學(xué)習(xí)技術(shù)

2015-03-18 10:41:34

圖片驗(yàn)證驗(yàn)證碼12306

2020-11-16 07:28:53

驗(yàn)證碼

2009-08-11 14:05:28

JSP驗(yàn)證碼

2009-02-09 14:17:36

2021-01-19 10:29:34

短信驗(yàn)證碼密碼

2022-02-11 07:10:15

驗(yàn)證碼

2017-12-21 07:38:19

2015-03-23 17:58:04

驗(yàn)證碼倒計(jì)時(shí)并行
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)