温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#怎么实现验证码图片识别功能

发布时间:2021-08-25 17:14:20 阅读:204 作者:chen 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要讲解了“C#怎么实现验证码图片识别功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现验证码图片识别功能”吧!

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

GrayByPixels();//灰度处理  GetPicValidByValue(128,4);//得到有效空间  Bitmap[]pics=GetSplitPics(4,1);//分割  stringcode=GetSingleBmpCode(pics[i],128);//得到代码串

具体使用,请参见我做的例子:

usingSystem;  usingSystem.Collections.Generic;  usingSystem.Text;  usingSystem.Collections;  usingSystem.Drawing;  usingSystem.Drawing.Imaging;  usingSystem.Runtime.InteropServices;  namespaceBallotAiying2  {  classUnCodebase  {  publicBitmapbmpobj;  publicUnCodebase(Bitmappic)  {  bmpobj=newBitmap(pic);//转换为Format32bppRgb  }  /**////<summary> ///根据RGB,计算灰度值  ///</summary> ///<paramnameparamname="posClr">Color值</param> ///<returns>灰度值,整型</returns> privateintGetGrayNumColor(System.Drawing.ColorposClr)  {  return(posClr.R*19595+posClr.G*38469+posClr.B*7472)>>16;  }  /**////<summary> ///灰度转换,逐点方式  ///</summary> publicvoidGrayByPixels()  {  for(inti=0;i<bmpobj.Height;i++)  {  for(intj=0;j<bmpobj.Width;j++)  {  inttmpValue=GetGrayNumColor(bmpobj.GetPixel(j,i));  bmpobj.SetPixel(j,i,Color.FromArgb(tmpValue,tmpValue,tmpValue));  }  }  }  /**////<summary> ///去图形边框  ///</summary> ///<paramnameparamname="borderWidth"></param> publicvoidClearPicBorder(intborderWidth)  {  for(inti=0;i<bmpobj.Height;i++)  {  for(intj=0;j<bmpobj.Width;j++)  {  if(i<borderWidth||j<borderWidth||j>bmpobj.Width-1-borderWidth||i>bmpobj.Height-1-borderWidth)  bmpobj.SetPixel(j,i,Color.FromArgb(255,255,255));  }  }  }  /**////<summary> ///灰度转换,逐行方式  ///</summary> publicvoidGrayByLine()  {  Rectanglerec=newRectangle(0,0,bmpobj.Width,bmpobj.Height);  BitmapDatabmpData=bmpobj.LockBits(rec,ImageLockMode.ReadWrite,bmpobj.PixelFormat);//PixelFormat.Format32bppPArgb);  //bmpData.PixelFormat=PixelFormat.Format24bppRgb;  IntPtrscan0=bmpData.Scan0;  intlen=bmpobj.Width*bmpobj.Height;  int[]pixels=newint[len];  Marshal.Copy(scan0,pixels,0,len);  //对图片进行处理  intGrayValue=0;  for(inti=0;i<len;i++)  {  GrayValue=GetGrayNumColor(Color.FromArgb(pixels[i]));  pixels[i]=(byte)(Color.FromArgb(GrayValue,GrayValue,GrayValue)).ToArgb();//Color转byte  }  bmpobj.UnlockBits(bmpData);  }  /**////<summary> ///得到有效图形并调整为可平均分割的大小  ///</summary> ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> ///<paramnameparamname="CharsCount">有效字符数</param> ///<returns></returns> publicvoidGetPicValidByValue(intdgGrayValue,intCharsCount)  {  intposx1=bmpobj.Width;intposy1=bmpobj.Height;  intposx2=0;intposy2=0;  for(inti=0;i<bmpobj.Height;i++)//找有效区  {  for(intj=0;j<bmpobj.Width;j++)  {  intpixelValue=bmpobj.GetPixel(j,i).R;  if(pixelValue<dgGrayValue)//根据灰度值  {  if(posx1>j)posx1=j;  if(posy1>i)posy1=i;  if(posx2<j)posx2=j;  if(posy2<i)posy2=i;  };  };  };  //确保能整除  intSpan=CharsCount-(posx2-posx1+1)%CharsCount;//可整除的差额数  if(Span<CharsCount)  {  intleftSpan=Span/2;//分配到左边的空列,如span为单数,则右边比左边大1  if(posx1>leftSpan)  posx1posx1=posx1-leftSpan;  if(posx2+Span-leftSpan<bmpobj.Width)  posx2posx2=posx2+Span-leftSpan;  }  //复制新图  RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);  }  /**////<summary> ///得到有效图形,图形为类变量  ///</summary> ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> ///<paramnameparamname="CharsCount">有效字符数</param> ///<returns></returns> publicvoidGetPicValidByValue(intdgGrayValue)  {  intposx1=bmpobj.Width;intposy1=bmpobj.Height;  intposx2=0;intposy2=0;  for(inti=0;i<bmpobj.Height;i++)//找有效区  {  for(intj=0;j<bmpobj.Width;j++)  {  intpixelValue=bmpobj.GetPixel(j,i).R;  if(pixelValue<dgGrayValue)//根据灰度值  {  if(posx1>j)posx1=j;  if(posy1>i)posy1=i;  if(posx2<j)posx2=j;  if(posy2<i)posy2=i;  };  };  };  //复制新图  RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);  }  /**////<summary> ///得到有效图形,图形由外面传入  ///</summary> ///<paramnameparamname="dgGrayValue">灰度背景分界值</param> ///<paramnameparamname="CharsCount">有效字符数</param> ///<returns></returns> publicBitmapGetPicValidByValue(Bitmapsinglepic,intdgGrayValue)  {  intposx1=singlepic.Width;intposy1=singlepic.Height;  intposx2=0;intposy2=0;  for(inti=0;i<singlepic.Height;i++)//找有效区  {  for(intj=0;j<singlepic.Width;j++)  {  intpixelValue=singlepic.GetPixel(j,i).R;  if(pixelValue<dgGrayValue)//根据灰度值  {  if(posx1>j)posx1=j;  if(posy1>i)posy1=i;  if(posx2<j)posx2=j;  if(posy2<i)posy2=i;  };  };  };  //复制新图  RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);  returnsinglepic.Clone(cloneRect,singlepic.PixelFormat);  }  /**////<summary> ///平均分割图片  ///</summary> ///<paramnameparamname="RowNum">水平上分割数</param> ///<paramnameparamname="ColNum">垂直上分割数</param> ///<returns>分割好的图片数组</returns> publicBitmap[]GetSplitPics(intRowNum,intColNum)  {  if(RowNum==0||ColNum==0)  returnnull;  intsingW=bmpobj.Width/RowNum;  intsingH=bmpobj.Height/ColNum;  Bitmap[]PicArray=newBitmap[RowNum*ColNum];  RectanglecloneRect;  for(inti=0;i<ColNum;i++)//找有效区  {  for(intj=0;j<RowNum;j++)  {  cloneRect=newRectangle(j*singW,i*singH,singW,singH);  PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);//复制小块图  }  }  returnPicArray;  }  /**////<summary> ///返回灰度图片的点阵描述字串,1表示灰点,0表示背景  ///</summary> ///<paramnameparamname="singlepic">灰度图</param> ///<paramnameparamname="dgGrayValue">背前景灰色界限</param> ///<returns></returns> publicstringGetSingleBmpCode(Bitmapsinglepic,intdgGrayValue)  {  Colorpiexl;  stringcode="";  for(intposy=0;posy<singlepic.Height;posy++)  for(intposx=0;posx<singlepic.Width;posx++)  {  piexl=singlepic.GetPixel(posx,posy);  if(piexl.R<dgGrayValue)//Color.Black)  codecode=code+"1";  else  codecode=code+"0";  }  returncode;  }  }  } 

感谢各位的阅读,以上就是“C#怎么实现验证码图片识别功能”的内容了,经过本文的学习后,相信大家对C#怎么实现验证码图片识别功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×