加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#一款比较美观的验证码

发布时间:2020-12-15 17:52:47 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    using System;  
    using System.Collections.Generic;  
    using System.Web;  
    using System.Web.UI;  
    using System.Web.UI.WebControls;  
    using System.Drawing;  
    using System.IO;  
    using System.Drawing.Imaging;  
      
    public partial class ValidateCode : System.Web.UI.Page  
    {  
        private int letterWidth = 16;//单个字体的宽度范围  
        private int letterHeight = 22;//单个字体的高度范围  
        private int letterCount = 4;//验证码位数  
        private char[] chars = "0123456789".ToCharArray();  
        private string[] fonts = { "Arial","Georgia" };  
        /// <summary>  
        /// 产生波形滤镜效果  
        /// </summary>  
        private const double PI = 3.1415926535897932384626433832795;  
        private const double PI2 = 6.283185307179586476925286766559;  
        protected void Page_Load(object sender,EventArgs e)  
        {  
            //防止网页后退--禁止缓存      
            Response.Expires = 0;  
            Response.Buffer = true;  
            Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);  
            Response.AddHeader("pragma","no-cache");  
            Response.CacheControl = "no-cache";  
            string str_ValidateCode = GetRandomNumberString(letterCount);  
            HttpCookie objCookie = new HttpCookie("ValidateCode");  
            objCookie.Value = str_ValidateCode;  
            objCookie.Path = "/";  
            objCookie.Expires = DateTime.Now.AddSeconds(1200);  
            Response.Cookies.Add(objCookie);  
            CreateImage(str_ValidateCode);  
      
        }  
        public void CreateImage(string checkCode)  
        {  
            int int_ImageWidth = checkCode.Length * letterWidth;  
            Random newRandom = new Random();  
            Bitmap image = new Bitmap(int_ImageWidth,letterHeight);  
            Graphics g = Graphics.FromImage(image);  
            //生成随机生成器  
            Random random = new Random();  
            //白色背景  
            g.Clear(Color.White);  
            //画图片的背景噪音线  
            for (int i = 0; i < 10; i++)  
            {  
                int x1 = random.Next(image.Width);  
                int x2 = random.Next(image.Width);  
                int y1 = random.Next(image.Height);  
                int y2 = random.Next(image.Height);  
      
                g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);  
            }  
      
            //画图片的前景噪音点  
            for (int i = 0; i < 10; i++)  
            {  
                int x = random.Next(image.Width);  
                int y = random.Next(image.Height);  
      
                image.SetPixel(x,y,Color.FromArgb(random.Next()));  
            }  
            //随机字体和颜色的验证码字符  
      
            int findex;  
            for (int int_index = 0; int_index < checkCode.Length; int_index++)  
            {  
                findex = newRandom.Next(fonts.Length - 1);  
                string str_char = checkCode.Substring(int_index,1);  
                Brush newBrush = new SolidBrush(GetRandomColor());  
                Point thePos = new Point(int_index * letterWidth + 1 + newRandom.Next(3),1 + newRandom.Next(3));//5+1+a+s+p+x  
                g.DrawString(str_char,new Font(fonts[findex],12,FontStyle.Bold),newBrush,thePos);  
            }  
            //灰色边框  
            g.DrawRectangle(new Pen(Color.LightGray,1),int_ImageWidth - 1,(letterHeight - 1));  
            //图片扭曲  
            //image = TwistImage(image,true,3,4);  
            //将生成的图片发回客户端  
            MemoryStream ms = new MemoryStream();  
            image.Save(ms,ImageFormat.Png);  
            Response.ClearContent(); //需要输出图象信息 要修改HTTP头   
            Response.ContentType = "image/Png";  
            Response.BinaryWrite(ms.ToArray());  
            g.Dispose();  
            image.Dispose();  
        }  
        /// <summary>  
        /// 正弦曲线Wave扭曲图片  
        /// </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 destBmp = new Bitmap(srcBmp.Width,srcBmp.Height);  
            // 将位图背景填充为白色  
            System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);  
            graph.FillRectangle(new SolidBrush(System.Drawing.Color.White),destBmp.Width,destBmp.Height);  
            graph.Dispose();  
            double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;  
      
            for (int i = 0; i < destBmp.Width; i++)  
            {  
                for (int j = 0; j < destBmp.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 < destBmp.Width && nOldY >= 0 && nOldY < destBmp.Height)  
                    {  
                        destBmp.SetPixel(nOldX,nOldY,color);  
                    }  
                }  
            }  
            return destBmp;  
        }  
      
        public Color GetRandomColor()  
        {  
            Random RandomNum_First = new Random((int)DateTime.Now.Ticks);  
            System.Threading.Thread.Sleep(RandomNum_First.Next(50));  
            Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);  
            int int_Red = RandomNum_First.Next(210);  
            int int_Green = RandomNum_Sencond.Next(180);  
            int int_Blue = (int_Red + int_Green > 300) ? 0 : 400 - int_Red - int_Green;  
            int_Blue = (int_Blue > 255) ? 255 : int_Blue;  
            return Color.FromArgb(int_Red,int_Green,int_Blue);// 5+1+a+s+p+x  
        }  
      
        //  生成随机数字字符串  
        public string GetRandomNumberString(int int_NumberLength)  
        {  
            Random random = new Random();  
            string validateCode = string.Empty;  
            for (int i = 0; i < int_NumberLength; i++)  
                validateCode += chars[random.Next(0,chars.Length)].ToString();  
            return validateCode;  
        }  
    }  

    <img alt="看不清,换一张" title="看不清,换一张" src="ValidateCode.aspx" style="cursor:pointer" onclick="this.src=this.src+'?r='+Math.random()" />  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读