生成圖形驗證碼


  介紹生成兩種類型的圖形驗證碼: 1.普通的隨機字符串;  2.隨機運算表達式

 圖形驗證碼類:

/// <summary>
    /// 圖形驗證碼類
    /// </summary>
    public class PicCaptcha
    {
        #region Constructed Methods
        /// <summary>
        /// 默認構造方法
        /// </summary>
        public PicCaptcha()
        {
        }

        /// <summary>
        ///構造方法 
        /// </summary>
        /// <param name="cpatchaType">驗證碼類型</param>
        public PicCaptcha(CaptchaType cpatchaType)
        {
            this.CaptchaType = cpatchaType;
        }

        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="captchaType">驗證碼類型</param>
        /// <param name="width">圖形寬度</param>
        /// <param name="height">圖形高度</param>
        public PicCaptcha(CaptchaType captchaType, int width, int height)
            : this(captchaType)
        {
            this.Width = width;
            this.Height = height;
        }

        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="captchaType">驗證碼類型</param>
        /// <param name="width">圖形寬度</param>
        /// <param name="height">圖形高度</param>
        /// <param name="fontSize">字體大小</param>
        public PicCaptcha(CaptchaType captchaType, int width, int height, int fontSize)
            : this(captchaType, width, height)
        {
            this.FontSize = fontSize;
        }

        #endregion

        #region Fields

        private int _width = 80;                                    //default width
        private int _height = 25;                                   //default height
        private int _fontSize = 16;                                 //default fontSize
        private CaptchaType _captchaType = CaptchaType.RandomType;  //default captchaType

        #endregion

        #region Properties
        /// <summary>
        /// 驗證碼圖形寬度
        /// </summary>
        public int Width
        {
            get { return _width; }
            set { _width = value; }
        }
        /// <summary>
        /// 驗證碼圖形高度
        /// </summary>
        public int Height
        {
            get { return _height; }
            set { _height = value; }
        }
        /// <summary>
        /// 驗證碼字體大小
        /// </summary>
        public int FontSize
        {
            get { return _fontSize; }
            set { _fontSize = value; }
        }
        /// <summary>
        /// 驗證碼類型
        /// </summary>
        public CaptchaType CaptchaType
        {
            get { return _captchaType; }
            set { _captchaType = value; }
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// 獲取生成的驗證碼圖片
        /// </summary>
        /// <param name="matchCode">與驗證碼圖片相匹配的內容,一般將該內容保存至session中,用於校驗</param>
        /// <returns>驗證碼圖片</returns>
        public Bitmap GetCaptchaPic(out string matchCode)
        {
            matchCode = null;
            string captchaContent = null;
            switch (_captchaType)  //需要生成的驗證碼類型
            {
                case CaptchaType.RandomString:
                    {
                        string randomStr = CreateCheckCodeString(4);
                        captchaContent = randomStr;
                        matchCode = randomStr;
                        break;
                    }
                case CaptchaType.RandomOperationExpression:
                    {
                        string[] codes = CreateOperateCheckCode();
                        captchaContent = codes[0];
                        matchCode = codes[1];
                        break;
                    }
                case CaptchaType.RandomType:
                    {
                        RandomSelectCreateMethod(out captchaContent, out matchCode);
                        break;
                    }
                default:
                    throw new Exception("unknow CaptchaType!");
            }
            return GenerateCaptchaPic(captchaContent);   //生成驗證碼圖片
        }

        #endregion

        #region  Private Methods

        /// <summary>
        /// 生成驗證碼圖片
        /// </summary>
        /// <param name="captchaContent">驗證碼內容</param>
        /// <returns>圖片</returns>
        private Bitmap GenerateCaptchaPic(string captchaContent)
        {
            var font = new Font("Arial", _fontSize, FontStyle.Bold);//驗證碼字體
            var brush = new SolidBrush(Color.Black);//用於寫驗證碼的畫筆
            var crosswise = new Pen(Color.Green, 0);//畫橫向干擾線的鋼筆
            var vertical = new Pen(Color.FromArgb(255, 100, 100, 100), 0);//畫縱向干擾線的鋼筆
            var image = new Bitmap(_width, _height);//生成圖像
            using (Graphics g = Graphics.FromImage(image))  //生成一個繪畫面板(畫布)
            {
                g.Clear(ColorTranslator.FromHtml("#f0f0f0"));//用指定顏色填充畫布
                RectangleF rect = new RectangleF(5, 2, _width, _height);//定義文字的繪制矩形
                Random rand = new Random((int)DateTime.Now.Ticks);//生成干擾線的隨機對象
                for (int i = 1; i <= 4; i++)   //干擾線
                {
                    Point start = new Point(0, rand.Next(_height));
                    Point end = new Point(_width, rand.Next(_height));
                    g.DrawLine(crosswise, start, end);
                }
                for (int i = 1; i <= 5; i++)  //干擾線
                {
                    Point start = new Point(rand.Next(_width), 0);
                    Point end = new Point(rand.Next(_width), _height);
                    g.DrawLine(vertical, start, end);
                }
                g.DrawString(captchaContent, font, brush, rect);//將驗證碼寫到畫布上
            }
            return image;
        }

        /// <summary>
        /// 隨機選擇生成驗證碼的方法
        /// </summary>
        /// <param name="captchaContent">驗證碼圖片顯示的內容</param>
        /// <param name="matchCode">與驗證碼圖片匹配的內容</param>
        private void RandomSelectCreateMethod(out string captchaContent, out string matchCode)
        {
            captchaContent = "";
            matchCode = "";
            int currSeconds = DateTime.Now.Second;
            if (currSeconds % 2 == 0)
            {
                captchaContent = matchCode = CreateCheckCodeString(4);
            }
            else
            {
                string[] codes = CreateOperateCheckCode();
                captchaContent = codes[0];
                matchCode = codes[1];
            }
            return;
        }

        /// <summary>
        /// 生成len位隨機字符串
        /// </summary>
        /// <param name="len">隨機字符串長度</param>
        /// <returns>len位隨機字符串</returns>
        private string CreateCheckCodeString(int len)
        {
            //定義用於驗證碼的字符數組
            char[] checkCodeArray ={ '1','2','3','4','5','6','7','8','9','A','B','C',
        'D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W',
        'X','Y','Z'};
            //定義驗證碼字符串
            string randomcode = "";
            Random rd = new Random();
            //生成4位驗證碼字符串
            for (int i = 1; i <= len; i++)
                randomcode += checkCodeArray[rd.Next(checkCodeArray.Length)];
            return randomcode;
        }

        /// <summary>
        /// 生成隨機的運算表達式  1+1=?,2
        /// </summary>
        /// <returns>codes[0]: 表達式; codes[1]: 運算結果</returns>
        private string[] CreateOperateCheckCode()
        {
            string[] codes = new string[2] { "", "" };
            string[] operators = new string[] { "+", "-" };
            int result = 0;
            Random random = new Random();
            int num1 = random.Next(10); // [0,19)
            int num2 = random.Next(10);
            string oper = operators[random.Next(operators.Length)];
            switch (oper)
            {
                case "+":
                    {
                        result = num1 + num2;
                        break;
                    }
                case "-":
                    {
                        result = num1 - num2;
                        break;
                    }
                default:
                    throw new Exception("operators error");
            }
            codes[0] = string.Format("{0}{1}{2}=?", num1, oper, num2);
            codes[1] = result.ToString();
            return codes;
        }

        #endregion
    }

    /// <summary>
    /// 生成的驗證碼類型
    /// </summary>
    public enum CaptchaType
    {
        /// <summary>
        /// 隨機類型, 在所有支持的驗證碼類型中,隨機選擇一種
        /// </summary>
        RandomType,
        /// <summary>
        /// 普通的隨機字符串,如: jH9Y, 12H8
        /// </summary>
        RandomString,
        /// <summary>
        /// 隨機運算表達式, 如: 1+2=?, 5加2=?, 4-2=?
        /// </summary>
        RandomOperationExpression,
    }

  

一般處理程序(.ashx)示例:

/// <summary>
    /// 生成圖形驗證碼
    /// </summary>
    public class CreateCode : IHttpHandler, IRequiresSessionState
    {
        private static readonly string CodeSessionName = "Code_Session_Name";

        public void ProcessRequest(HttpContext context)
        {
            string checkCodeSession = string.Empty; 
            var captChaPic = new PicCaptcha();
            using (var image = captChaPic.GetCaptchaPic(out checkCodeSession))  //獲取驗證碼圖片
            using (var ms = new MemoryStream())
            {
                context.Session.Add(CodeSessionName, checkCodeSession);         //驗證碼校驗內容保存到sessioin中
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                context.Response.ClearContent();
                context.Response.ContentType = "image/Gif";
                context.Response.BinaryWrite(ms.ToArray());
            }
            return;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

  

 

下載:

一般處理程序源碼文件下載,請點擊. 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM