验证吗

来源:互联网 发布:js 获取兄弟节点 编辑:程序博客网 时间:2024/04/27 14:41
 

/*********************************
 *
 * FileName:validate.cs
 * Copyright:(c) 2007-2-1
 * Writer:星星
 * Create Date:2007-2-1
 * Rewriter:
 * Rewrite Date:
 * Impact:
 * Main Content:验证码 可以启中文验证码(可以自行修改,但请存留以上信息)  
 *
 *********************************/

using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;


/// <summary>
///  验证码
/// </summary>
namespace ImageValidate
{
    /// <summary>
    /// 验证码
    /// </summary>
    /// <param name="m_nDisturbLine">干扰线</param>
    /// <param name="m_nDisturbPoint">干扰点</param>
    /// <param name="m_strFontSize">字体大小</param>
    /// <param name="m_strValidate">验证码字符串</param>
    public class Validate
    {
        #region 变量声明
        int     m_nDisturbLine , m_nDisturbPoint ;
        int     m_strFontSize = 13;
        string  m_strFont = "宋体";
        string  m_strValidate=null;
        #endregion

        #region 构造函数
        /// <summary>
        ///
        /// </summary>
        /// <param name="nDisturbLine">干扰线</param>
        /// <param name="nDisturbPoint">干扰点</param>
        public Validate(int nDisturbLine, int nDisturbPoint)
        {
            this.m_nDisturbLine = nDisturbLine;
            this.m_nDisturbPoint = nDisturbPoint;
        }
        #endregion

        #region  属性
        /// <summary>
        /// 获取验证码字符串 用以保存在Session
        /// </summary>
        public string strValidate
        {
            get { return this.m_strValidate; }
        }

        /// <summary>
        /// 设置或获取验证码字体
        /// </summary>
        public string strFont
        {
            get { return this.m_strFont; }
            set { this.m_strFont = value; }
        }

        /// <summary>
        /// 设置或获取验证码字体大小
        /// </summary>
        public int nFontSize
        {
            get { return this.m_strFontSize; }
            set { this.m_strFontSize = value; }
        }
        #endregion

        /// <summary>
        /// 获取字母数字验证码字符串
        /// </summary>
        /// <param name="nLength">验证码字符个数</param>
        /// <returns>验证码字符串</returns>
        private string GetStrAscii(int nLength)
        {
            int     nStrLength  = nLength;
            string  strString   = "1234567890qwertyuioplkjhgfdsazxcvbnmASDFGHJKLMNBVCXZQWERTYUIOP";
            StringBuilder strtemp = new StringBuilder();  
            Random random = new Random((int)DateTime.Now.Ticks);
            for (int i = 0; i < nStrLength; i++)
            {
                random = new Random(unchecked(random.Next() * 1000));
                strtemp.Append(strString[random.Next(61)]);
            }
            return strtemp.ToString();
        }


        /// <summary>
        /// 获取中文验证码字符串
        /// </summary>
        /// <param name="nLength">验证码字符中文的个数</param>
        /// <returns>验证码字符串(中文)</returns>
        private string GetStrChinese(int nLength)
        {
            int      nStrLength = nLength;
            object[] btStrings  = new object[nStrLength];
            string[] strString  = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

            Random random = new Random();
            for (int i = 0; i < nStrLength; i++)
            {
                //区位码第1位  
                int     nNext1   = random.Next(11, 14);
                string  strChar1 = strString[nNext1];

                //区位码第2位  
                random = new Random(nNext1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的  

                int nNext2;
                if (nNext1 == 13)
                {
                    nNext2 = random.Next(0, 7);
                }
                else
                {
                    nNext2 = random.Next(0, 16);
                }
                string strChar2 = strString[nNext2];

                //区位码第3位  
                random  = new Random(nNext2 * unchecked((int)DateTime.Now.Ticks) + i);
                int     nNext3   = random.Next(10, 16);
                string  strChar3 = strString[nNext3];

                //区位码第4位  
                random  = new Random(nNext3 * unchecked((int)DateTime.Now.Ticks) + i);
                int nNext4;
                if (nNext3 == 10)
                {
                    nNext4 = random.Next(1, 16);
                }
                else if (nNext3 == 15)
                {
                    nNext4 = random.Next(0, 15);
                }
                else
                {
                    nNext4 = random.Next(0, 16);
                }
                string strChar4 = strString[nNext4];

                byte    bt1      = Convert.ToByte(strChar1 + strChar2, 16);
                byte    bt2      = Convert.ToByte(strChar3 + strChar4, 16);
                byte[]  btString = new byte[2] { bt1, bt2 };

                btStrings.SetValue(btString, i);
            }

            //转化成汉字
            StringBuilder   strReturn = new StringBuilder();
            Encoding        edGb2312 = Encoding.GetEncoding("gb2312");
            for (int i = 0; i < nStrLength; i++)
            {
                strReturn.Append(edGb2312.GetString((byte[])Convert.ChangeType(btStrings[i], typeof(byte[]))));
            }
            return strReturn.ToString();
        }

        /// <summary>
        /// 获取验证码图片
        /// </summary>
        /// <param name="nValidateLength">验证码字符个数</param>
        /// <param name="nImgWidth">图片宽度</param>
        /// <param name="nImgHeight">图片高度</param>
        /// <returns>流的图片</returns>
        public MemoryStream GetCode(int nType,int nValidateLength ,int nImgWidth, int nImgHeight)
        {
            MemoryStream    stream = null;

            if (nType == 0)    //是否启用汉字验证码
            {
                m_strValidate = this.GetStrChinese(nValidateLength);
            }
            else
            {
                m_strValidate = this.GetStrAscii(nValidateLength);
            }
         
            Bitmap      image = new Bitmap(nImgWidth, nImgHeight);
            Graphics    grImg = Graphics.FromImage(image);
            try
            {
                Random  random = new Random();
                grImg.Clear(Color.White);//清空图片背景色

                //画图片的干扰线
                for (int i = 0; i < m_nDisturbLine; 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);
                    grImg.DrawLine(new Pen(Color.SkyBlue), x1, y1, x2, y2);
                }

                Font font = new Font(m_strFont, m_strFontSize, FontStyle.Bold);
                LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Black, 10.2f, false);
                grImg.DrawString(m_strValidate, font, brush, 3, 2);
               
                //画图片的前景干扰点
                for (int i = 0; i < m_nDisturbPoint; i++)
                {
                    int x = random.Next(image.Width);
                    int y = random.Next(image.Height);
                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }
                grImg.DrawRectangle(new Pen(Color.Olive), 0, 0, image.Width - 1, image.Height - 1);//画图片的边框线
                //保存图片数据
                stream = new MemoryStream();
                image.Save(stream, ImageFormat.Jpeg);
            }
            finally
            {
                grImg.Dispose();
                image.Dispose();
            }
            return stream;
        }
    }
}
 

 

//====================
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Drawing"%>
<%@ Import Namespace="System.Drawing.Drawing2D"%>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Drawing.Imaging"%>
<%@ Import Namespace="System.Text"%>
<%@ Import Namespace="ImageValidate"%>
<script runat="server">
   void page_load(object sender , EventArgs e)
    {
        Validate validate = new Validate(12, 50);
        validate.strFont = "宋体";
        validate.nFontSize = 13;
        MemoryStream stream = validate.GetCode(0, 4, 82, 22);
      
        Response.Clear();
        Response.ContentType = "image/jpeg";
        Response.BinaryWrite(stream.ToArray());

        stream.Close();
    }
</script>