日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
概述C#代碼和驗(yàn)證碼圖片

最近寫了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)友們妥善用之。

贛州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

封裝后的類使用很簡(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. namespaceBallotAiying2
  9. {
  10. classUnCodebase
  11. {
  12. publicBitmapbmpobj;
  13. publicUnCodebase(Bitmappic)
  14. {
  15. bmpobj=newBitmap(pic);//轉(zhuǎn)換為Format32bppRgb
  16. }
  17. /**////
  18. ///根據(jù)RGB,計(jì)算灰度值
  19. ///
  20. ///<paramnameparamname="posClr">Color值
  21. ///灰度值,整型
  22. privateintGetGrayNumColor(System.Drawing.ColorposClr)
  23. {
  24. return(posClr.R*19595+posClr.G*38469+posClr.B*7472)>>16;
  25. }
  26. /**////
  27. ///灰度轉(zhuǎn)換,逐點(diǎn)方式
  28. ///
  29. publicvoidGrayByPixels()
  30. {
  31. for(inti=0;i;i++)
  32. {
  33. for(intj=0;j;j++)
  34. {
  35. inttmpValue=GetGrayNumColor(bmpobj.GetPixel(j,i));
  36. bmpobj.SetPixel(j,i,Color.FromArgb(tmpValue,tmpValue,tmpValue));
  37. }
  38. }
  39. }
  40. /**////
  41. ///去圖形邊框
  42. ///
  43. ///<paramnameparamname="borderWidth">
  44. publicvoidClearPicBorder(intborderWidth)
  45. {
  46. for(inti=0;i;i++)
  47. {
  48. for(intj=0;j;j++)
  49. {
  50. if(i||j||j>bmpobj.
    Width-1-borderWidth||i>bmpobj.Height-1-borderWidth)
  51. bmpobj.SetPixel(j,i,Color.FromArgb(255,255,255));
  52. }
  53. }
  54. }
  55. /**////
  56. ///灰度轉(zhuǎn)換,逐行方式
  57. ///
  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. //對(duì)圖片進(jìn)行處理
  68. intGrayValue=0;
  69. for(inti=0;i;i++)
  70. {
  71. GrayValue=GetGrayNumColor(Color.FromArgb(pixels[i]));
  72. pixels[i]=(byte)(Color.FromArgb(GrayValue,GrayValue,GrayValue)).ToArgb();//Color轉(zhuǎn)byte
  73. }
  74. bmpobj.UnlockBits(bmpData);
  75. }
  76. /**////
  77. ///得到有效圖形并調(diào)整為可平均分割的大小
  78. ///
  79. ///<paramnameparamname="dgGrayValue">灰度背景分界值
  80. ///<paramnameparamname="CharsCount">有效字符數(shù)
  81. ///
  82. publicvoidGetPicValidByValue(intdgGrayValue,intCharsCount)
  83. {
  84. intposx1=bmpobj.Width;intposy1=bmpobj.Height;
  85. intposx2=0;intposy2=0;
  86. for(inti=0;i;i++)//找有效區(qū)
  87. {
  88. for(intj=0;j;j++)
  89. {
  90. intpixelValue=bmpobj.GetPixel(j,i).R;
  91. if(pixelValue)//根據(jù)灰度值
  92. {
  93. if(posx1>j)posx1=j;
  94. if(posy1>i)posy1=i;
  95. if(posx2)posx2=j;
  96. if(posy2)posy2=i;
  97. };
  98. };
  99. };
  100. //確保能整除
  101. intSpan=CharsCount-(posx2-posx1+1)%CharsCount;//可整除的差額數(shù)
  102. if(Span)
  103. {
  104. intleftSpan=Span/2;//分配到左邊的空列,如span為單數(shù),則右邊比左邊大1
  105. if(posx1>leftSpan)
  106. posx1posx1=posx1-leftSpan;
  107. if(posx2+Span-leftSpan)
  108. posx2posx2=posx2+Span-leftSpan;
  109. }
  110. //復(fù)制新圖
  111. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
  112. bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);
  113. }
  114. /**////
  115. ///得到有效圖形,圖形為類變量
  116. ///
  117. ///<paramnameparamname="dgGrayValue">灰度背景分界值
  118. ///<paramnameparamname="CharsCount">有效字符數(shù)
  119. ///
  120. publicvoidGetPicValidByValue(intdgGrayValue)
  121. {
  122. intposx1=bmpobj.Width;intposy1=bmpobj.Height;
  123. intposx2=0;intposy2=0;
  124. for(inti=0;i;i++)//找有效區(qū)
  125. {
  126. for(intj=0;j;j++)
  127. {
  128. intpixelValue=bmpobj.GetPixel(j,i).R;
  129. if(pixelValue)//根據(jù)灰度值
  130. {
  131. if(posx1>j)posx1=j;
  132. if(posy1>i)posy1=i;
  133. if(posx2)posx2=j;
  134. if(posy2)posy2=i;
  135. };
  136. };
  137. };
  138. //復(fù)制新圖
  139. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
  140. bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);
  141. }
  142. /**////
  143. ///得到有效圖形,圖形由外面?zhèn)魅?
  144. ///
  145. ///<paramnameparamname="dgGrayValue">灰度背景分界值
  146. ///<paramnameparamname="CharsCount">有效字符數(shù)
  147. ///
  148. publicBitmapGetPicValidByValue(Bitmapsinglepic,intdgGrayValue)
  149. {
  150. intposx1=singlepic.Width;intposy1=singlepic.Height;
  151. intposx2=0;intposy2=0;
  152. for(inti=0;i;i++)//找有效區(qū)
  153. {
  154. for(intj=0;j;j++)
  155. {
  156. intpixelValue=singlepic.GetPixel(j,i).R;
  157. if(pixelValue)//根據(jù)灰度值
  158. {
  159. if(posx1>j)posx1=j;
  160. if(posy1>i)posy1=i;
  161. if(posx2)posx2=j;
  162. if(posy2)posy2=i;
  163. };
  164. };
  165. };
  166. //復(fù)制新圖
  167. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
  168. returnsinglepic.Clone(cloneRect,singlepic.PixelFormat);
  169. }
  170. /**////
  171. ///平均分割圖片
  172. ///
  173. ///<paramnameparamname="RowNum">水平上分割數(shù)
  174. ///<paramnameparamname="ColNum">垂直上分割數(shù)
  175. ///分割好的圖片數(shù)組
  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;i++)//找有效區(qū)
  185. {
  186. for(intj=0;j;j++)
  187. {
  188. cloneRect=newRectangle(j*singW,i*singH,singW,singH);
  189. PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);//復(fù)制小塊圖
  190. }
  191. }
  192. returnPicArray;
  193. }
  194. /**////
  195. ///返回灰度圖片的點(diǎn)陣描述字串,1表示灰點(diǎn),0表示背景
  196. ///
  197. ///<paramnameparamname="singlepic">灰度圖
  198. ///<paramnameparamname="dgGrayValue">背前景灰色界限
  199. ///
  200. publicstringGetSingleBmpCode(Bitmapsinglepic,intdgGrayValue)
  201. {
  202. Colorpiexl;
  203. stringcode="";
  204. for(intposy=0;posy;posy++)
  205. for(intposx=0;posx;posx++)
  206. {
  207. piexl=singlepic.GetPixel(posx,posy);
  208. if(piexl.R)//Color.Black)
  209. codecode=code+"1";
  210. else
  211. codecode=code+"0";
  212. }
  213. returncode;
  214. }
  215. }
  216. }

以上介紹C#代碼和驗(yàn)證碼圖片


本文題目:概述C#代碼和驗(yàn)證碼圖片
文章起源:http://www.dlmjj.cn/article/djipedj.html