最近写了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#代码和验证码图片
本文标题:概述C#代码和验证码图片
本文路径:http://www.shufengxianlan.com/qtweb/news1/158601.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联