C# C/S 图片验证码功能源码
生活随笔
收集整理的這篇文章主要介紹了
C# C/S 图片验证码功能源码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
運行效果如圖
用法如下:
???????? /// ? <summary>???????? /// ?顯示驗證碼
???????? /// ? </summary>
???????? /// ? <returns> 驗證碼 </returns>
???????? private ? void ?GetVerifyCode()
????????{
????????????VerifyCodeImage?verifyCodeImage? = ? new ?VerifyCodeImage();
???????????? // ?取隨機碼
???????????? string ?code? = ?verifyCodeImage.CreateVerifyCode().ToUpper();
???????????? // ?輸出圖片
???????????? this .picVerifyCode.Image? = ?verifyCodeImage.CreateImage(code,? 3 );
???????????? this .picVerifyCode.Tag? = ?code;
????????}
?
???????? private ? void ?picVerifyCode_DoubleClick( object ?sender,?EventArgs?e)????????{
???????????? this .GetVerifyCode();
???????????? // ?this.txtVerifyCode.Clear();
???????????? this .txtVerifyCode.SelectAll();
???????????? this .txtVerifyCode.Focus();
????????}
?
源碼如下:
// -----------------------------------------------------------------// ?All?Rights?Reserved?,?Copyright?(C)?2011?,?Hairihan?TECH,?Ltd.?
// -----------------------------------------------------------------
using ?System;
using ?System.Drawing;
using ?System.Web;
namespace ?DotNet.Utilities
{
???? public ? class ?VerifyCodeImage
????{
???????? public ?VerifyCodeImage()
????????{
????????}
???????? #region ?驗證碼長度(默認4個驗證碼的長度)
???????? int ?length? = ? 4 ;
???????? public ? int ?Length
????????{
???????????? get ?{? return ?length;?}
???????????? set ?{?length? = ?value;?}
????????}
???????? #endregion
???????? #region ?驗證碼字體大小(為了顯示扭曲效果,默認40像素,可以自行修改)
???????? int ?fontSize? = ? 50 ;
???????? public ? int ?FontSize
????????{
???????????? get ?{? return ?fontSize;?}
???????????? set ?{?fontSize? = ?value;?}
????????}
???????? #endregion
???????? #region ?邊框補(默認1像素)
???????? int ?padding? = ? 2 ;
???????? public ? int ?Padding
????????{
???????????? get ?{? return ?padding;?}
???????????? set ?{?padding? = ?value;?}
????????}
???????? #endregion
???????? #region ?是否輸出燥點(默認不輸出)
???????? bool ?chaos? = ? true ;
???????? public ? bool ?Chaos
????????{
???????????? get ?{? return ?chaos;?}
???????????? set ?{?chaos? = ?value;?}
????????}
???????? #endregion
???????? #region ?輸出燥點的顏色(默認灰色)
????????Color?chaosColor? = ?Color.LightGray;
???????? public ?Color?ChaosColor
????????{
???????????? get ?{? return ?chaosColor;?}
???????????? set ?{?chaosColor? = ?value;?}
????????}
???????? #endregion
???????? #region ?自定義背景色(默認白色)
????????Color?backgroundColor? = ?Color.White;
???????? public ?Color?BackgroundColor
????????{
???????????? get ?{? return ?backgroundColor;?}
???????????? set ?{?backgroundColor? = ?value;?}
????????}
???????? #endregion
???????? #region ?自定義隨機顏色數組
????????Color[]?colors? = ?{?Color.Black,?Color.Red,?Color.DarkBlue,?Color.Green,?Color.Orange,?Color.Brown,?Color.DarkCyan,?Color.Purple?};
???????? public ?Color[]?Colors
????????{
???????????? get ?{? return ?colors;?}
???????????? set ?{?colors? = ?value;?}
????????}
???????? #endregion
???????? #region ?自定義字體數組
???????? string []?fonts? = ?{? " Arial " ,? " Georgia " ?};
???????? public ? string []?Fonts
????????{
???????????? get ?{? return ?fonts;?}
???????????? set ?{?fonts? = ?value;?}
????????}
???????? #endregion
???????? #region ?自定義隨機碼字符串序列(使用逗號分隔)
???????? // ??去除?0,1,i,l,o,I,L,O
???????? string ?codeSerial? = ? " 2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,T,U,V,W,X,Y,Z " ;
???????? public ? string ?CodeSerial
????????{
???????????? get ?{? return ?codeSerial;?}
???????????? set ?{?codeSerial? = ?value;?}
????????}
???????? #endregion
???????? #region ?產生波形濾鏡效果
???????? // private?const?double?PI?=?3.1415926535897932384626433832795;
???????? private ? const ? double ?PI2? = ? 6.283185307179586476925286766559 ;
???????? /// ? <summary>
???????? /// ?正弦曲線Wave扭曲圖片(Edit?By?51aspx.com)
???????? /// ? </summary>
???????? /// ? <param?name="srcBmp"> 圖片路徑 </param>
???????? /// ? <param?name="bXDir"> 如果扭曲則選擇為True </param>
???????? /// ? <param?name="nMultValue"> 波形的幅度倍數,越大扭曲的程度越高,一般為3 </param>
???????? /// ? <param?name="dPhase"> 波形的起始相位,取值區間[0-2*PI) </param>
???????? /// ? <returns></returns>
???????? public ?System.Drawing.Bitmap?TwistImage(Bitmap?srcBmp,? bool ?bXDir,? double ?dMultValue,? double ?dPhase)
????????{
????????????System.Drawing.Bitmap?bitmap? = ? new ?Bitmap(srcBmp.Width,?srcBmp.Height);
???????????? // ?將位圖背景填充為白色
????????????System.Drawing.Graphics?graphics? = ?System.Drawing.Graphics.FromImage(bitmap);
????????????graphics.FillRectangle( new ?SolidBrush(System.Drawing.Color.White),? 0 ,? 0 ,?bitmap.Width,?bitmap.Height);
????????????graphics.Dispose();
???????????? double ?dBaseAxisLen? = ?bXDir? ? ?( double )bitmap.Height?:?( double )bitmap.Width;
???????????? for ?( int ?i? = ? 0 ;?i? < ?bitmap.Width;?i ++ )
????????????{
???????????????? for ?( int ?j? = ? 0 ;?j? < ?bitmap.Height;?j ++ )
????????????????{
???????????????????? double ?dx? = ? 0 ;
????????????????????dx? = ?bXDir? ? ?(PI2? * ?( double )j)? / ?dBaseAxisLen?:?(PI2? * ?( double )i)? / ?dBaseAxisLen;
????????????????????dx? += ?dPhase;
???????????????????? double ?dy? = ?Math.Sin(dx);
???????????????????? // ?取得當前點的顏色
???????????????????? int ?nOldX? = ? 0 ,?nOldY? = ? 0 ;
????????????????????nOldX? = ?bXDir? ? ?i? + ?( int )(dy? * ?dMultValue)?:?i;
????????????????????nOldY? = ?bXDir? ? ?j?:?j? + ?( int )(dy? * ?dMultValue);
????????????????????System.Drawing.Color?color? = ?srcBmp.GetPixel(i,?j);
???????????????????? if ?(nOldX? >= ? 0 ? && ?nOldX? < ?bitmap.Width
????????????????????? && ?nOldY? >= ? 0 ? && ?nOldY? < ?bitmap.Height)
????????????????????{
????????????????????????bitmap.SetPixel(nOldX,?nOldY,?color);
????????????????????}
????????????????}
????????????}
???????????? return ?bitmap;
????????}
???????? #endregion
???????? #region ?生成校驗碼圖片
???????? public ?Bitmap?CreateImage( string ?code,? double ?multValue)
????????{
???????????? int ?fSize? = ?FontSize;
???????????? int ?fWidth? = ?fSize? + ?Padding;
???????????? int ?imageWidth? = ?( int )(code.Length? * ?fWidth)? + ? 4 ? + ?Padding? * ? 2 ;
???????????? int ?imageHeight? = ?fSize? * ? 2 ? + ?Padding;
????????????System.Drawing.Bitmap?bitmap? = ? new ?System.Drawing.Bitmap(imageWidth,?imageHeight);
????????????Graphics?graphics? = ?Graphics.FromImage(bitmap);
????????????graphics.Clear(BackgroundColor);
????????????Random?rand? = ? new ?Random();
???????????? // ?給背景添加隨機生成的燥點
???????????? if ?( this .Chaos)
????????????{
????????????????Pen?pen? = ? new ?Pen(ChaosColor,? 0 );
???????????????? int ?c? = ?Length? * ? 10 ;
???????????????? for ?( int ?i? = ? 0 ;?i? < ?c;?i ++ )
????????????????{
???????????????????? int ?x? = ?rand.Next(bitmap.Width);
???????????????????? int ?y? = ?rand.Next(bitmap.Height);
????????????????????graphics.DrawRectangle(pen,?x,?y,? 1 ,? 1 );
????????????????}
????????????}
???????????? int ?left? = ? 0 ,?top? = ? 0 ,?top1? = ? 1 ,?top2? = ? 1 ;
???????????? int ?n1? = ?(imageHeight? - ?FontSize? - ?Padding? * ? 2 );
???????????? int ?n2? = ?n1? / ? 4 ;
????????????top1? = ?n2;
????????????top2? = ?n2? * ? 2 ;
????????????Font?font;
????????????Brush?brush;
???????????? int ?cindex,?findex;
???????????? // ?隨機字體和顏色的驗證碼字符
???????????? for ?( int ?i? = ? 0 ;?i? < ?code.Length;?i ++ )
????????????{
????????????????cindex? = ?rand.Next(Colors.Length? - ? 1 );
????????????????findex? = ?rand.Next(Fonts.Length? - ? 1 );
????????????????font? = ? new ?System.Drawing.Font(Fonts[findex],?fSize,?System.Drawing.FontStyle.Bold);
????????????????brush? = ? new ?System.Drawing.SolidBrush(Colors[cindex]);
???????????????? if ?(i? % ? 2 ? == ? 1 )
????????????????{
????????????????????top? = ?top2;
????????????????}
???????????????? else
????????????????{
????????????????????top? = ?top1;
????????????????}
????????????????left? = ?i? * ?fWidth;
????????????????graphics.DrawString(code.Substring(i,? 1 ),?font,?brush,?left,?top);
????????????}
???????????? // ?畫一個邊框?邊框顏色為Color.Gainsboro
????????????graphics.DrawRectangle( new ?Pen(Color.Gainsboro,? 0 ),? 0 ,? 0 ,?bitmap.Width? - ? 1 ,?bitmap.Height? - ? 1 );
????????????graphics.Dispose();
???????????? // ?產生波形
????????????bitmap? = ?TwistImage(bitmap,? true ,?multValue,? 4 );
???????????? return ?bitmap;
????????}
???????? #endregion
???????? #region ?生成隨機字符碼
???????? public ? string ?CreateVerifyCode( int ?codeLength)
????????{
???????????? if ?(codeLength? == ? 0 )
????????????{
????????????????codeLength? = ?Length;
????????????}
???????????? string []?arr? = ?CodeSerial.Split( ' , ' );
???????????? string ?code? = ? "" ;
???????????? int ?randValue? = ? - 1 ;
????????????Random?random? = ? new ?Random( unchecked (( int )DateTime.Now.Ticks));
???????????? for ?( int ?i? = ? 0 ;?i? < ?codeLength;?i ++ )
????????????{
????????????????randValue? = ?random.Next( 0 ,?arr.Length? - ? 1 );
????????????????code? += ?arr[randValue];
????????????}
???????????? return ?code;
????????}
???????? public ? string ?CreateVerifyCode()
????????{
???????????? return ?CreateVerifyCode( 0 );
????????}
???????? #endregion
???????? #region ?將創建好的圖片輸出到頁面
???????? /// ? <summary>
???????? /// ?將創建好的圖片輸出到頁面
???????? /// ? </summary>
???????? /// ? <param?name="code"> 驗證碼 </param>
???????? /// ? <param?name="multValue"> 扭曲度(越大越扭曲) </param>
???????? /// ? <param?name="httpContext"> 上下文 </param>
???????? public ? void ?CreateImageOnPage( string ?code,? double ?multValue,?HttpContext?httpContext)
????????{
????????????System.IO.MemoryStream?memoryStream? = ? new ?System.IO.MemoryStream();
????????????Bitmap?bitmap? = ? this .CreateImage(code,?multValue);
????????????bitmap.Save(memoryStream,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????httpContext.Response.ClearContent();
????????????httpContext.Response.ContentType? = ? " image/Jpeg " ;
????????????httpContext.Response.BinaryWrite(memoryStream.GetBuffer());
????????????memoryStream.Close();
????????????memoryStream? = ? null ;
????????????bitmap.Dispose();
????????????bitmap? = ? null ;
????????}
???????? #endregion
????}
}
?
?
轉載于:https://my.oschina.net/iwenr/blog/227597
總結
以上是生活随笔為你收集整理的C# C/S 图片验证码功能源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP代码调试神器Whoops
- 下一篇: 制作数据集-解析篇