jjccx

jjccx's blog
posts - 31, comments - 97, trackbacks - 5, articles - 70
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

验证码

Posted on 2005-05-13 16:21 jjccx 阅读(320) 评论(0)  编辑 收藏
在网上找了些代码,改了一下,增加文字波浪式抖动,和加噪音。
代码:

public class VerifyCode

{

     public VerifyCode()

     {

     }

 

     public static string Generate(int length)

     {

         string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//0123456789";

          System.Text.StringBuilder sb = new System.Text.StringBuilder(length);

         Random r = new Random();

 

          for(int i = 0; i < length; i++)

         {

              sb.Append(s[r.Next(0, s.Length)]);

         }

         return sb.ToString();

     }

 

     public static void WriteToOutput(string verifyCode, HttpResponse response)

     {

         int fontSize;

          fontSize = 11;

 

          System.Drawing.Bitmap bitmap = new Bitmap(verifyCode.Length * (fontSize + 2), 45);

          Graphics g = Graphics.FromImage(bitmap);

 

         Font f = new System.Drawing.Font("Arial", fontSize);

         Brush b = null;//new System.Drawing.SolidBrush(Color.White);

 

          g.Clear(Color.Blue);

 

         Random r = new Random();

 

          for(int i = 0; i < verifyCode.Length; i++)

         {

              b = new SolidBrush(Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)));

              g.DrawString(verifyCode[i].ToString(), f, b, 10 + 11 * i, r.Next(10, 20));

         }

 

         bitmap = TwistImage(bitmap);

         bitmap = AddNoisePointToImage(bitmap);

 

          System.IO.MemoryStream ms = new System.IO.MemoryStream();

          bitmap.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);

          response.ClearContent();

 

          response.ContentType = "image/Jpeg";

          response.BinaryWrite(ms.ToArray());

 

          g.Dispose();

          bitmap.Dispose();

     }

 

     private static Bitmap TwistImage(Bitmap bitmap)

     {

         Bitmap bitmapret = new Bitmap(bitmap);

          Graphics g = Graphics.FromImage(bitmapret);

          g.Clear(Color.Blue);

 

          bitmapret = AddNoiseLineToImage(bitmapret);//在这里加噪音弧线可以保证其不影响人对验证码的识别

 

         Random r = new Random();

         double k = Convert.ToDouble(r.Next(0, 4));

 

         try

         {

              for (int j = 0; j < bitmapret.Width; j++)

              {

                   int offset = Convert.ToInt32(Math.Sin(Convert.ToDouble(j) / 20 + k) * 10);

 

                   for(int i = bitmapret.Height - 10; i > 10; i--)

                       if(i + offset >= 0 && i + offset < bitmapret.Height)

                            bitmapret.SetPixel(j, i + offset, bitmap.GetPixel(j, i));

              }

              return bitmapret;

         }

         catch (Exception)

         {

              throw;

         }

     }

 

     private static Bitmap AddNoiseLineToImage(Bitmap bitmap)

     {

         Random r = new Random();

 

          for(int i = 0; i < bitmap.Width * bitmap.Height / 200; i++)

         {

              Point point = new Point(r.Next(1, bitmap.Width), r.Next(1, bitmap.Height));

              Size size = new Size(r.Next(10, 20), r.Next(10, 20));

 

              int startAngle = r.Next(0, 360);

              int sweepAngle = r.Next(startAngle, startAngle + r.Next(60, 180));

 

              Pen pen = new Pen(Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)), (float)1);

              Graphics g = Graphics.FromImage(bitmap);

              g.DrawArc(pen, new Rectangle(point, size), startAngle, sweepAngle);

 

              g.Dispose();

         }

 

         return bitmap;

     }

 

     private static Bitmap AddNoisePointToImage(Bitmap bitmap)

     {

         Random r = new Random();

 

         for (int num1 = 0; num1 < (bitmap.Height - 1); num1++)

         {

              for (int num2 = 0; num2 < (bitmap.Width - 1); num2++)

              {

                   Color color1 = bitmap.GetPixel(num2, num1);

                  if(r.Next(0, 40) == 20)

                   {

                        bitmap.SetPixel(num2, num1, Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)));

                   }

              }

         }

 

         return bitmap;

     }

}

调用:
Session["VerifyCode"] = VerifyCode.Generate(10);
VerifyCode.WriteToOutput(Session["VerifyCode"].ToString(), this.Response);
验证:

if(this.TextBox1.Text == Session["VerifyCode"].ToString())

     this.Literal1.Text = "验证成功!";

else

     this.Literal1.Text = "验证失败!";
下面是效果图: