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

赣州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,简单几句实现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
 - }
 - /**////
 - ///根据RGB,计算灰度值
 - ///
 - ///<paramnameparamname="posClr">Color值
 - ///
 灰度值,整型 - privateintGetGrayNumColor(System.Drawing.ColorposClr)
 - {
 - return(posClr.R*19595+posClr.G*38469+posClr.B*7472)>>16;
 - }
 - /**////
 - ///灰度转换,逐点方式
 - ///
 - publicvoidGrayByPixels()
 - {
 - for(inti=0;i
 ;i++) - {
 - for(intj=0;j
 ;j++) - {
 - inttmpValue=GetGrayNumColor(bmpobj.GetPixel(j,i));
 - bmpobj.SetPixel(j,i,Color.FromArgb(tmpValue,tmpValue,tmpValue));
 - }
 - }
 - }
 - /**////
 - ///去图形边框
 - ///
 - ///<paramnameparamname="borderWidth">
 - publicvoidClearPicBorder(intborderWidth)
 - {
 - for(inti=0;i
 ;i++) - {
 - for(intj=0;j
 ;j++) - {
 - if(i
 ||j ||j>bmpobj. 
Width-1-borderWidth||i>bmpobj.Height-1-borderWidth)- bmpobj.SetPixel(j,i,Color.FromArgb(255,255,255));
 - }
 - }
 - }
 - /**////
 - ///灰度转换,逐行方式
 - ///
 - 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
 ;i++) - {
 - GrayValue=GetGrayNumColor(Color.FromArgb(pixels[i]));
 - pixels[i]=(byte)(Color.FromArgb(GrayValue,GrayValue,GrayValue)).ToArgb();//Color转byte
 - }
 - bmpobj.UnlockBits(bmpData);
 - }
 - /**////
 - ///得到有效图形并调整为可平均分割的大小
 - ///
 - ///<paramnameparamname="dgGrayValue">灰度背景分界值
 - ///<paramnameparamname="CharsCount">有效字符数
 - ///
 - publicvoidGetPicValidByValue(intdgGrayValue,intCharsCount)
 - {
 - intposx1=bmpobj.Width;intposy1=bmpobj.Height;
 - intposx2=0;intposy2=0;
 - for(inti=0;i
 ;i++)//找有效区 - {
 - for(intj=0;j
 ;j++) - {
 - intpixelValue=bmpobj.GetPixel(j,i).R;
 - if(pixelValue
 )//根据灰度值 - {
 - if(posx1>j)posx1=j;
 - if(posy1>i)posy1=i;
 - if(posx2
 )posx2=j; - if(posy2)posy2=i;
 - };
 - };
 - };
 - //确保能整除
 - intSpan=CharsCount-(posx2-posx1+1)%CharsCount;//可整除的差额数
 - if(Span
 ) - {
 - intleftSpan=Span/2;//分配到左边的空列,如span为单数,则右边比左边大1
 - if(posx1>leftSpan)
 - posx1posx1=posx1-leftSpan;
 - if(posx2+Span-leftSpan
 ) - posx2posx2=posx2+Span-leftSpan;
 - }
 - //复制新图
 - RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
 - bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);
 - }
 - /**////
 - ///得到有效图形,图形为类变量
 - ///
 - ///<paramnameparamname="dgGrayValue">灰度背景分界值
 - ///<paramnameparamname="CharsCount">有效字符数
 - ///
 - publicvoidGetPicValidByValue(intdgGrayValue)
 - {
 - intposx1=bmpobj.Width;intposy1=bmpobj.Height;
 - intposx2=0;intposy2=0;
 - for(inti=0;i
 ;i++)//找有效区 - {
 - for(intj=0;j
 ;j++) - {
 - intpixelValue=bmpobj.GetPixel(j,i).R;
 - if(pixelValue
 )//根据灰度值 - {
 - if(posx1>j)posx1=j;
 - if(posy1>i)posy1=i;
 - if(posx2
 )posx2=j; - if(posy2)posy2=i;
 - };
 - };
 - };
 - //复制新图
 - RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
 - bmpobjbmpobj=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);
 - }
 - /**////
 - ///得到有效图形,图形由外面传入
 - ///
 - ///<paramnameparamname="dgGrayValue">灰度背景分界值
 - ///<paramnameparamname="CharsCount">有效字符数
 - ///
 - publicBitmapGetPicValidByValue(Bitmapsinglepic,intdgGrayValue)
 - {
 - intposx1=singlepic.Width;intposy1=singlepic.Height;
 - intposx2=0;intposy2=0;
 - for(inti=0;i
 ;i++)//找有效区 - {
 - for(intj=0;j
 ;j++) - {
 - intpixelValue=singlepic.GetPixel(j,i).R;
 - if(pixelValue
 )//根据灰度值 - {
 - if(posx1>j)posx1=j;
 - if(posy1>i)posy1=i;
 - if(posx2
 )posx2=j; - if(posy2)posy2=i;
 - };
 - };
 - };
 - //复制新图
 - RectanglecloneRect=newRectangle(posx1,posy1,posx2-posx1+1,posy2-posy1+1);
 - returnsinglepic.Clone(cloneRect,singlepic.PixelFormat);
 - }
 - /**////
 - ///平均分割图片
 - ///
 - ///<paramnameparamname="RowNum">水平上分割数
 - ///<paramnameparamname="ColNum">垂直上分割数
 - ///
 分割好的图片数组 - 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
 ;i++)//找有效区 - {
 - for(intj=0;j
 ;j++) - {
 - cloneRect=newRectangle(j*singW,i*singH,singW,singH);
 - PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect,bmpobj.PixelFormat);//复制小块图
 - }
 - }
 - returnPicArray;
 - }
 - /**////
 - ///返回灰度图片的点阵描述字串,1表示灰点,0表示背景
 - ///
 - ///<paramnameparamname="singlepic">灰度图
 - ///<paramnameparamname="dgGrayValue">背前景灰色界限
 - ///
 - publicstringGetSingleBmpCode(Bitmapsinglepic,intdgGrayValue)
 - {
 - Colorpiexl;
 - stringcode="";
 - for(intposy=0;posy
 ;posy++) - for(intposx=0;posx
 ;posx++) - {
 - piexl=singlepic.GetPixel(posx,posy);
 - if(piexl.R
 )//Color.Black) - codecode=code+"1";
 - else
 - codecode=code+"0";
 - }
 - returncode;
 - }
 - }
 - }
 
以上介绍C#代码和验证码图片
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号