很实用的验证码

来源:互联网 发布:手机ping测试软件 编辑:程序博客网 时间:2024/04/29 10:54

 using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Drawing;


/*
 * 应用时,用以下代码即可  
 * OTC.Utility.ValidateCodeHelper.CreateRandomCode(4);
 */
namespace OTC.Utility
{
    public sealed class ValidateCodeHelper
    {
        /**//// <summary>
        /// 生成随机码
        /// </summary>
        /// <param name="length">随机码个数</param>
        public static void CreateRandomCode(int length)
        {
            CreateRandomCode("ValidateCode", length);
        }
        /**////  <summary>
        ///  生成随机码
        ///  </summary>
        /// <param name="strSessionName">session的名称</param>
        ///  <param  name="length">随机码个数</param>
        ///  <returns></returns>
        public static void CreateRandomCode(string strSessionName,int length)
        {
            string randomcode = String.Empty;
            randomcode = getCode(length);
            HttpContext.Current.Session[strSessionName] = randomcode;
            //ViewState["ValidateCode"]  =  randomcode;
            CreateImage(randomcode);
        }
        /// <summary>
        /// 生成一定长度的验证码
        /// </summary>
        /// <param name="length">长度</param>
        /// <returns></returns>
        private static string getCode(int length)
        {
            int rand;
            char code;
            string randomcode = String.Empty;
            System.Random random = new Random();
            for (int i = 0; i < length; i++)
            {
                rand = random.Next();

                switch (rand % 3)
                {
                    case 0:
                        code = (char)('A' + (char)((random.Next()) % 26));
                        break;
                    case 1:
                        code = (char)('0' + (char)((random.Next()) % 10));
                        break;
                    default:
                        code = (char)('a' + (char)((random.Next()) % 26));
                        break;
                }
                randomcode += code.ToString();
            }
            return randomcode;
        }

        ///  <summary>
        ///  创建随机码图片
        ///  </summary>
        ///  <param  name="randomcode">随机码</param>
        private static void CreateImage(string randomcode)
        {
            int randAngle = 45;        //随机转动角度
            int mapwidth = (int)(randomcode.Length * 23);
            Bitmap map = new Bitmap(mapwidth,32);           //创建图片背景
            Graphics graph = Graphics.FromImage(map);
           

            graph.Clear(Color.AliceBlue);              //清除画面,填充背景
                    
            Random rand = new Random();            
           
            //验证码旋转,防止机器识别
            char[] chars = randomcode.ToCharArray();       //拆散字符串成单字符数组

            //文字居中
            StringFormat format = new StringFormat(StringFormatFlags.NoClip);
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
           
            ////定义颜色
            Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
            //画图片的背景噪音线(此段代码要放在定义字体前)
            for (int i = 0; i < 10; i++)
            {
                int x1 = rand.Next(map.Width);
                int x2 = rand.Next(map.Width);
                int y1 = rand.Next(map.Height);
                int y2 = rand.Next(map.Height);

                graph.DrawLine(new Pen(c[rand.Next(8)]), x1, y1, x2, y2);
            }

            ////定义字体
            string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
            for (int i = 0; i < chars.Length; i++)
            {
                Point dot = new Point(16, 16);
                float angle = rand.Next(-randAngle, randAngle);     //转动的度数

                int findex = rand.Next(5);
                int cindex = rand.Next(8);
                Font f = new System.Drawing.Font(font[findex], rand.Next(15, 20), System.Drawing.FontStyle.Regular);//***设置字体
                Brush b = new System.Drawing.SolidBrush(c[cindex]);
               
                graph.TranslateTransform(dot.X, dot.Y);      //移动光标到指定位置
                graph.RotateTransform(angle);
                graph.DrawString(chars[i].ToString(), f, b, (i * 3)-2, rand.Next(6), format);   //字符串整体样式
                graph.RotateTransform(-angle);      //转回去
                graph.TranslateTransform(2, -dot.Y);     //移动光标到指定位置
            }
           

            )
           
                      
            //画图片的前景噪音点
            for (int i = 0; i < 100; i++)
            {
                int x = rand.Next(map.Width);
                int y = rand.Next(map.Height);

                map.SetPixel(x, y, Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255)));
            }

            //生成图片
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            HttpContext.Current.Response.ClearContent();
            HttpContext.Current.Response.ContentType = "image/gif";
            HttpContext.Current.Response.BinaryWrite(ms.ToArray());
            graph.Dispose();
            map.Dispose();
        }
    }
}

 

 


效果:

原创粉丝点击