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

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

赣州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,简单几句实现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. namespaceBallotAiying2
  9. {
  10. classUnCodebase
  11. {
  12. publicBitmapbmpobj;
  13. publicUnCodebase(Bitmappic)
  14. {
  15. bmpobj=newBitmap(pic);//转换为Format32bppRgb
  16. }
  17. /**////
  18. ///根据RGB,计算灰度值
  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. ///灰度转换,逐点方式
  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. ///灰度转换,逐行方式
  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. //对图片进行处理
  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转byte
  73. }
  74. bmpobj.UnlockBits(bmpData);
  75. }
  76. /**////
  77. ///得到有效图形并调整为可平均分割的大小
  78. ///
  79. ///<paramnameparamname="dgGrayValue">灰度背景分界值
  80. ///<paramnameparamname="CharsCount">有效字符数
  81. ///
  82. publicvoidGetPicValidByValue(intdgGrayValue,intCharsCount)
  83. {
  84. intposx1=bmpobj.Width;intposy1=bmpobj.Height;
  85. intposx2=0;intposy2=0;
  86. for(inti=0;i;i++)//找有效区
  87. {
  88. for(intj=0;j;j++)
  89. {
  90. intpixelValue=bmpobj.GetPixel(j,i).R;
  91. if(pixelValue)//根据灰度值
  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;//可整除的差额数
  102. if(Span)
  103. {
  104. intleftSpan=Span/2;//分配到左边的空列,如span为单数,则右边比左边大1
  105. if(posx1>leftSpan)
  106. posx1posx1=posx1-leftSpan;
  107. if(posx2+Span-leftSpan)
  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. /**////
  115. ///得到有效图形,图形为类变量
  116. ///
  117. ///<paramnameparamname="dgGrayValue">灰度背景分界值
  118. ///<paramnameparamname="CharsCount">有效字符数
  119. ///
  120. publicvoidGetPicValidByValue(intdgGrayValue)
  121. {
  122. intposx1=bmpobj.Width;intposy1=bmpobj.Height;
  123. intposx2=0;intposy2=0;
  124. for(inti=0;i;i++)//找有效区
  125. {
  126. for(intj=0;j;j++)
  127. {
  128. intpixelValue=bmpobj.GetPixel(j,i).R;
  129. if(pixelValue)//根据灰度值
  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. //复制新图
  139. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
  140. bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);
  141. }
  142. /**////
  143. ///得到有效图形,图形由外面传入
  144. ///
  145. ///<paramnameparamname="dgGrayValue">灰度背景分界值
  146. ///<paramnameparamname="CharsCount">有效字符数
  147. ///
  148. publicBitmapGetPicValidByValue(Bitmapsinglepic,intdgGrayValue)
  149. {
  150. intposx1=singlepic.Width;intposy1=singlepic.Height;
  151. intposx2=0;intposy2=0;
  152. for(inti=0;i;i++)//找有效区
  153. {
  154. for(intj=0;j;j++)
  155. {
  156. intpixelValue=singlepic.GetPixel(j,i).R;
  157. if(pixelValue)//根据灰度值
  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. //复制新图
  167. RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
  168. returnsinglepic.Clone(cloneRect,singlepic.PixelFormat);
  169. }
  170. /**////
  171. ///平均分割图片
  172. ///
  173. ///<paramnameparamname="RowNum">水平上分割数
  174. ///<paramnameparamname="ColNum">垂直上分割数
  175. ///分割好的图片数组
  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++)//找有效区
  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);//复制小块图
  190. }
  191. }
  192. returnPicArray;
  193. }
  194. /**////
  195. ///返回灰度图片的点阵描述字串,1表示灰点,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#代码和验证码图片

本文标题:概述C#代码和验证码图片
本文路径:http://www.shufengxianlan.com/qtweb/news1/158601.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联