重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“C#怎么实现验证码图片识别功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现验证码图片识别功能”吧!
成都创新互联公司是专业的容城网站建设公司,容城接单;提供网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行容城网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,简单几句实现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#怎么实现验证码图片识别功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!