概述C#代码和验证码图片

开发 后端
本文介绍C#代码和验证码图片,尽管每个网站的验证码图片都不相同,识别的方法有所差别,简单几句实现C#代码和验证码图片识别。

最近写了C#代码和验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。但写得多了,也总结出不少相同之处。今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。

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

  1. GrayByPixels();//灰度处理  
  2. GetPicValidByValue(128,4);//得到有效空间  
  3. Bitmap[]pics=GetSplitPics(4,1);//分割  
  4. 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#代码和验证码图片

【编辑推荐】

  1. 分析C#不安全代码
  2. 浅析C#调用ImageAnimator
  3. C#连接Access、SQL Server数据库
  4. 浅谈C#固定的和活动的变量
  5. 介绍C#中的值类型
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-13 10:47:29

C#创建验证码

2009-08-12 11:05:00

2014-04-24 10:09:05

验证码C#

2023-10-27 08:53:13

Python验证码图片识别

2012-05-24 15:41:38

PHP

2024-01-29 08:32:10

Python验证码识别

2020-08-12 09:14:45

Python验证码工具

2009-08-06 09:32:03

C#代码协同执行

2009-08-14 16:54:19

C# Hello Wo

2013-06-19 10:19:59

2015-03-18 10:41:34

图片验证验证码12306

2021-08-11 09:51:24

人工智能机器学习技术

2020-11-16 07:28:53

验证码

2009-08-11 14:05:28

JSP验证码

2009-02-09 14:17:36

2017-12-21 07:38:19

2015-03-23 17:58:04

验证码倒计时并行

2015-09-21 15:31:05

php实现验证码

2022-02-11 07:10:15

验证码
点赞
收藏

51CTO技术栈公众号