您好,登錄后才能下訂單哦!
這篇文章主要講解了“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#怎么實現驗證碼圖片識別功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。