首页 > 代码库 > 验证码程序

验证码程序

验证码的一般编写思路为:
       1.定义验证码字符长度;
       2.根据长度随机生成验证码字符串;
       3.将验证码字符串转换成图片形式,并在图片中生成随机噪声点和声线(对验证码进行模糊识别处理);
       4.显示结果。

 ///
    /// 生成随机验证码
    ///
    /// 验证码长度
    ///
    public string CreateIdentifyingCode(int CodeLen)
    {
       if (CodeLen < 1)
          return String.Empty;
       int num;
       string checkcode = String.Empty;
       Random random = new Random();
       for (int index = 0; index < CodeLen; index++)
       {
           num = random.Next();
           if (num % 2 == 0)
              checkcode += (char)(‘0‘ + (char)(num % 10));
           else
              checkcode += (char)(‘A‘ + (char)(num % 26));
        }
        return checkcode;
     }
-------------------------------------------------------------------------------------------------
     ///
     /// 生成验证码图片
     ///
     ///
     ///  
     private void CreateCheckCodeImage(string checkcode)
     {
         if (checkcode == null || checkcode.Trim() == String.Empty)
             return;
         //创建图片大小
         System.Drawing.Bitmap image = new             System.Drawing.Bitmap((int)Math.Ceiling(checkcode.Length*12.5),22);
         //创建画板
         Graphics graphic = Graphics.FromImage(image);

         try
         {
             Random random = new Random();
             graphic.Clear(Color.White);
             int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
             //画图片背景噪声线
             for (int index = 0; index < 25; index++)
             {
                 x1 = random.Next(image.Width);
                 y1 = random.Next(image.Height);
                 x2 = random.Next(image.Width);
                 y2 = random.Next(image.Height);
                 graphic.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
             }
             Font font = new System.Drawing.Font("Helvetica", 12, (FontStyle.Bold |FontStyle.Italic));
             LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),Color.Blue,Color.DarkBlue,1.2f,true);
             graphic.DrawString(checkcode,font,brush,2,2);

             int x = 0;
             int y = 0;
             // 画图片的前景噪声点
             for (int index = 0; index < 100; index++)
             {
                 x = random.Next(image.Width);
                 y = random.Next(image.Height);
                 image.SetPixel(x,y,Color.FromArgb(random.Next()));
             }
             //画图片的边框线
             graphic.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
             //网页响应
             System.IO.MemoryStream ms = new System.IO.MemoryStream();
             image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
             Response.ClearContent();
             Response.ContentType = "image/Gif";
             Response.BinaryWrite(ms.ToArray());
         }
         finally
         {
             graphic.Dispose();
             image.Dispose();
         }
     }

以上所生成的为简单的验证码。接下来我从其他的博客中学习了其他形式的效果。

/* 图片画线特殊效果:贝塞尔曲线 */
            Graphics graph = Graphics.FromImage(image);
            graph.Clear(Color.WhiteSmoke);
            Point[] myArray ={
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50)),
                                 new Point(random.Next(150),random.Next(50))
                             };
            Pen myPen = new Pen(Color.Blue, 1);
            GraphicsPath myPath = new GraphicsPath();
            myPath.AddBeziers(myArray);
            graph.DrawPath(myPen, myPath);

 验证码字符颜色变换效果:实现该效果,我们首先来定义一个颜色集合,然后通过for循环使其随机改变字体颜色则可。

 #region 定义颜色数组
        Color[] colors = { Color.Blue, Color.Green, Color.Red, Color.Gold, Color.Black, Color.Chocolate, Color.Orange, Color.Purple };
        public Color[] Colors
        {
            get { return colors; }
            set { colors = value; }
        }
        #endregion
        Brush brush;
        int colornum;
        for(int i=0; i
        {
           colornum = random.Next(Colors.Length - 1);
           brush = new System.Drawing.SolidBrush(Colors[cindex]);

           //利用DrawString函数进行颜色填充就可以了。
        }

 同样的原理我们也可以定义一个字体的数组来进行验证码字体切换。代码和颜色的类似,这里就不加以累赘。

接下来看看如何使得验证码的字体进行扭曲。这里的代码是从http://blog.sina.com.cn/s/blog_5d71453e0100y5t5.html学习的

 private const double PI = 3.1415926535897932384626433832795;
        private const double PI2 = 6.283185307179586476925286766559;
        ///
        /// 波形滤镜效果函数
        ///
        ///
        ///
        ///
        ///
        ///
        public System.Drawing.Bitmap TwistImage(Bitmap srcbmp, 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), 0, 0, destbmp.Width, destbmp.Height);
            graph.Dispose();
            double dbaselen = (double)destbmp.Width;
            for (int i = 0; i < destbmp.Width; i++)
            {
                for (int j = 0; j < destbmp.Height; j++)
                {
                    double dx = 0;
                    dx = (PI2 * (double)j) / dbaselen;
                    dx += dphase;

                    double dy = Math.Sin(dx);

                    int noldx = 0, noldy = 0;
                    noldx = i + (int)(dy * dmultvalue);
                    noldy = 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;
        }



验证码程序