这篇文章主要讲解了“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元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。