C#驗證碼識別類-網上摘抄的

來源:互聯網
上載者:User

using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Collections;<br />using System.Drawing;<br />using System.Drawing.Imaging;<br />using System.Runtime.InteropServices;<br />namespace BallotAiying2<br />...{<br /> class UnCodebase<br /> ...{<br /> public Bitmap bmpobj;<br /> public UnCodebase(Bitmap pic)<br /> ...{<br /> bmpobj = new Bitmap(pic); //轉換為淨化工程Format32bppRgb<br /> }<br /> /**//**//**//// <summary><br /> /// 根據RGB,計算灰階值<br /> /// </summary><br /> /// <param name="posClr">Color值</param><br /> /// <returns>灰階值,整型</returns><br /> private int GetGrayNumColor(System.Drawing.Color posClr)<br /> ...{<br /> return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16;<br /> }<br /> /**//**//**//// <summary><br /> /// 灰階轉換,逐點方式<br /> /// </summary><br /> public void GrayByPixels()<br /> ...{<br /> for (int i = 0; i < bmpobj.Height; i++)<br /> ...{<br /> for (int j = 0; j < bmpobj.Width; j++)<br /> ...{<br /> int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i));<br /> bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));<br /> }<br /> }<br /> }<br /> /**//**//**//// <summary><br /> /// 去圖形邊框<br /> /// </summary><br /> /// <param name="borderWidth"></param><br /> public void ClearPicBorder(int borderWidth)<br /> ...{<br /> for (int i = 0; i < bmpobj.Height; i++)<br /> ...{<br /> for (int j = 0; j < bmpobj.Width; j++)<br /> ...{<br /> if (i < borderWidth || j < borderWidth || j > bmpobj.Width - 1 - borderWidth || i > bmpobj.Height - 1 - borderWidth)<br /> bmpobj.SetPixel(j, i, Color.FromArgb(255, 255, 255));<br /> }<br /> }<br /> }<br /> /**//**//**//// <summary><br /> /// 灰階轉換,逐行方式<br /> /// </summary><br /> public void GrayByLine()<br /> ...{<br /> Rectangle rec = new Rectangle(0, 0, bmpobj.Width, bmpobj.Height);<br /> BitmapData bmpData = bmpobj.LockBits(rec, ImageLockMode.ReadWrite, bmpobj.PixelFormat);// PixelFormat.Format32bppPArgb);<br /> // 淨化裝置bmpData.PixelFormat = PixelFormat.Format24bppRgb;<br /> IntPtr scan0 = bmpData.Scan0;<br /> int len = bmpobj.Width * bmpobj.Height;<br /> int[] pixels = new int[len];<br /> Marshal.Copy(scan0, pixels, 0, len);<br /> //對圖片進行處理<br /> int GrayValue = 0;<br /> for (int i = 0; i < len; i++)<br /> ...{<br /> GrayValue = GetGrayNumColor(Color.FromArgb(pixels[i]));<br /> pixels[i] = (byte)(Color.FromArgb(GrayValue, GrayValue, GrayValue)).ToArgb(); //Color轉byte<br /> }<br /> bmpobj.UnlockBits(bmpData);<br /> }<br /> /**//**//**//// <summary><br /> /// 得到有效圖形並調整為可平均分割的大小<br /> /// </summary><br /> /// <param name="dgGrayValue">灰階背景分界值</param><br /> /// <param name="CharsCount">有效字元數</param><br /> /// <returns></returns><br /> public void GetPicValidByValue(int dgGrayValue, int CharsCount)<br /> ...{<br /> int posx1 = bmpobj.Width; int posy1 = bmpobj.Height;<br /> int posx2 = 0; int posy2 = 0;<br /> for (int i = 0; i < bmpobj.Height; i++) //找有效區<br /> ...{<br /> for (int j = 0; j < bmpobj.Width; j++)<br /> ...{<br /> int pixelValue = bmpobj.GetPixel(j, i).R;<br /> if (pixelValue < dgGrayValue) //根據灰階值<br /> ...{<br /> if (posx1 > j) posx1 = j;<br /> if (posy1 > i) posy1 = i;<br /> if (posx2 < j) posx2 = j;<br /> if (posy2 < i) posy2 = i;<br /> };<br /> };<br /> };<br /> // 確保能整除<br /> int Span = CharsCount - (posx2 - posx1 + 1) % CharsCount; //可整除的差額數<br /> if (Span < CharsCount)<br /> ...{<br /> int leftSpan = Span / 2; //分配到左邊的空列 ,如span為單數,則右邊比左邊大1<br /> if (posx1 > leftSpan)<br /> posx1 = posx1 - leftSpan;<br /> if (posx2 + Span - leftSpan < bmpobj.Width)<br /> posx2 = posx2 + Span - leftSpan;<br /> }<br /> //複製新圖<br /> Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);<br /> bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat);<br /> }</p><p> /**//**//**//// <summary><br /> /// 得到有效圖形,圖形為類變數<br /> /// </summary><br /> /// <param name="dgGrayValue">灰階背景分界值</param><br /> /// <param name="CharsCount">有效字元數</param><br /> /// <returns></returns><br /> public void GetPicValidByValue(int dgGrayValue)<br /> ...{<br /> int posx1 = bmpobj.Width; int posy1 = bmpobj.Height;<br /> int posx2 = 0; int posy2 = 0;<br /> for (int i = 0; i < bmpobj.Height; i++) //找有效區<br /> ...{<br /> for (int j = 0; j < bmpobj.Width; j++)<br /> ...{<br /> int pixelValue = bmpobj.GetPixel(j, i).R;<br /> if (pixelValue < dgGrayValue) //根據灰階值<br /> ...{<br /> if (posx1 > j) posx1 = j;<br /> if (posy1 > i) posy1 = i;<br /> if (posx2 < j) posx2 = j;<br /> if (posy2 < i) posy2 = i;<br /> };<br /> };<br /> };<br /> //複製新圖<br /> Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);<br /> bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat);<br /> }<br /> /**//**//**//// <summary><br /> /// 得到有效圖形,圖形由外面傳入<br /> /// </summary><br /> /// <param name="dgGrayValue">灰階背景分界值</param><br /> /// <param name="CharsCount">有效字元數</param><br /> /// <returns></returns><br /> public Bitmap GetPicValidByValue(Bitmap singlepic, int dgGrayValue)<br /> ...{<br /> int posx1 = singlepic.Width; int posy1 = singlepic.Height;<br /> int posx2 = 0; int posy2 = 0;<br /> for (int i = 0; i < singlepic.Height; i++) //找有效區<br /> ...{<br /> for (int j = 0; j < singlepic.Width; j++)<br /> ...{<br /> int pixelValue = singlepic.GetPixel(j, i).R;<br /> if (pixelValue < dgGrayValue) //根據灰階值<br /> ...{<br /> if (posx1 > j) posx1 = j;<br /> if (posy1 > i) posy1 = i;<br /> if (posx2 < j) posx2 = j;<br /> if (posy2 < i) posy2 = i;<br /> };<br /> };<br /> };<br /> //複製新圖<br /> Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);<br /> return singlepic.Clone(cloneRect, singlepic.PixelFormat);<br /> }</p><p> /**//**//**//// <summary><br /> /// 平均分割圖片<br /> /// </summary><br /> /// <param name="RowNum">水平上分割數</param><br /> /// <param name="ColNum">垂直上分割數</param><br /> /// <returns>分割好的圖片數組</returns><br /> public Bitmap [] GetSplitPics(int RowNum,int ColNum)<br /> ...{<br /> if (RowNum == 0 || ColNum == 0)<br /> return null;<br /> int singW = bmpobj.Width / RowNum;<br /> int singH = bmpobj.Height / ColNum;<br /> Bitmap [] PicArray=new Bitmap[RowNum*ColNum];<br /> Rectangle cloneRect;<br /> for (int i = 0; i < ColNum; i++) //找有效區<br /> ...{<br /> for (int j = 0; j < RowNum; j++)<br /> ...{<br /> cloneRect = new Rectangle(j*singW, i*singH, singW , singH);<br /> PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect, bmpobj.PixelFormat);//複製小塊圖<br /> }<br /> }<br /> return PicArray;<br /> }<br /> /**//**//**//// <summary><br /> /// 返回灰階圖片的點陣描述字串,1表示灰點,0表示背景<br /> /// </summary><br /> /// <param name="singlepic">灰階圖</param><br /> /// <param name="dgGrayValue">背前景灰色界限</param><br /> /// <returns></returns><br /> public string GetSingleBmpCode(Bitmap singlepic, int dgGrayValue)<br /> ...{<br /> Color piexl;<br /> string code = "";<br /> for (int posy = 0; posy < singlepic.Height; posy++)<br /> for (int posx = 0; posx < singlepic.Width; posx++)<br /> ...{<br /> piexl = singlepic.GetPixel(posx, posy);<br /> if (piexl.R < dgGrayValue) // Color.Black )<br /> code = code + "1";<br /> else<br /> code = code + "0";<br /> }<br /> return code;<br /> }<br /> }<br />}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.