12306奇葩验证码引发思考之C#实现验证码程序

2019-12-30 11:28:00王旭

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


/* 图片画线特殊效果:贝塞尔曲线 */
  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函数进行颜色填充就可以了。
 }

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


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;
 }