WinForm生成验证码图片的方法

本文实例讲述了WinForm生成验证码图片的方法。分享给大家供大家参考,具体如下:

1、创建ValidCode类:

public class ValidCode
{
  #region Private Fields
  private const double PI = 3.1415926535897932384626433832795;
  private const double PI2 = 6.283185307179586476925286766559;
  //private readonly int _wordsLen = 4;
  private int _len;
  private CodeType _codetype;
  private readonly Single _jianju = (float)18.0;
  private readonly Single _height = (float)24.0;
  private string _checkCode;
  #endregion
  #region Public Property
  public string CheckCode
  {
   get
   {
    return _checkCode;
   }
  }
  #endregion
  #region Constructors
  /// <summary>
  /// public constructors
  /// </summary>
  /// <param name="len"> 验证码长度 </param>
  /// <param name="ctype"> 验证码类型:字母、数字、字母+ 数字 </param>
  public ValidCode(int len, CodeType ctype)
  {
   this._len = len;
   this._codetype = ctype;
  }
  #endregion
  #region Public Field
  public enum CodeType { Words, Numbers, Characters, Alphas }
  #endregion
  #region Private Methods
  private string GenerateNumbers()
  {
   string strOut = "";
   System.Random random = new Random();
   for (int i = 0; i < _len; i++)
   {
    string num = Convert.ToString(random.Next(10000) % 10);
    strOut += num;
   }
   return strOut.Trim();
  }
  private string GenerateCharacters()
  {
   string strOut = "";
   System.Random random = new Random();
   for (int i = 0; i < _len; i++)
   {
    string num = Convert.ToString((char)(65 + random.Next(10000) % 26));
    strOut += num;
   }
   return strOut.Trim();
  }
  //
  private string GenerateAlphas()
  {
   string strOut = "";
   string num = "";
   System.Random random = new Random();
   for (int i = 0; i < _len; i++)
   {
    if (random.Next(500) % 2 == 0)
    {
     num = Convert.ToString(random.Next(10000) % 10);
    }
    else
    {
     num = Convert.ToString((char)(65 + random.Next(10000) % 26));
    }
    strOut += num;
   }
   return strOut.Trim();
  }
  private System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, 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 dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;
   for (int i = 0; i < destBmp.Width; i++)
   {
    for (int j = 0; j < destBmp.Height; j++)
    {
     double dx = 0;
     dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
     dx += dPhase;
     double dy = Math.Sin(dx);
     // 取得当前点的颜色
     int nOldX = 0, nOldY = 0;
     nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
     nOldY = bXDir ? j : 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;
  }
  #endregion
  #region Public Methods
  public Stream CreateCheckCodeImage()
  {
   string checkCode;
   switch (_codetype)
   {
    case CodeType.Alphas:
     checkCode = GenerateAlphas();
     break;
    case CodeType.Numbers:
     checkCode = GenerateNumbers();
     break;
    case CodeType.Characters:
     checkCode = GenerateCharacters();
     break;
    default:
     checkCode = GenerateAlphas();
     break;
   }
   this._checkCode = checkCode;
   MemoryStream ms = null;
   //
   if (checkCode == null || checkCode.Trim() == String.Empty)
    return null;
   Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * _jianju)), (int)_height);
   Graphics g = Graphics.FromImage(image);
   try
   {
    Random random = new Random();
    g.Clear(Color.White);
    // 画图片的背景噪音线
    for (int i = 0; i < 18; 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);
     g.DrawLine(new Pen(Color.FromArgb(random.Next()), 1), x1, y1, x2, y2);
    }
    Font font = new System.Drawing.Font("Times New Roman", 14, System.Drawing.FontStyle.Bold);
    LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
    if (_codetype != CodeType.Words)
    {
     for (int i = 0; i < checkCode.Length; i++)
     {
      g.DrawString(checkCode.Substring(i, 1), font, brush, 2 + i * _jianju, 1);
     }
    }
    else
    {
     g.DrawString(checkCode, font, brush, 2, 2);
    }
    // 画图片的前景噪音点
    for (int i = 0; i < 150; i++)
    {
     int x = random.Next(image.Width);
     int y = random.Next(image.Height);
     image.SetPixel(x, y, Color.FromArgb(random.Next()));
    }
    // 画图片的波形滤镜效果
    if (_codetype != CodeType.Words)
    {
     image = TwistImage(image, true, 3, 1);
    }
    // 画图片的边框线
    g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
    ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
   }
   finally
   {
    g.Dispose();
    image.Dispose();
   }
   return ms;
  }
  #endregion
}

2、产生验证码图片代码:

//参数一:产生几个字符的验证码图片 参数二:验证码的形式(数字、字母、数字字母混合都有)
ValidCode validCode = new ValidCode(5, ValidCode.CodeType.Alphas);
this.pictureBox2.Image = Bitmap.FromStream(validCode.CreateCheckCodeImage());

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》

希望本文所述对大家C#程序设计有所帮助。

(0)

相关推荐

  • C# winform登陆框验证码的实现方法

    本文实例为大家分享了C# winform登陆框验证码的具体代码,供大家参考,具体内容如下 1.  新建一个简单的 windows 应用项目 在默认的 Form1 中添加如下控件: 1)  Label : text = " 输入验证码 :" 2)  TextBox : name=" txtValidCode" 输入验证码的文本框 3)  Image : name=" picValidCode" 显示验证码的图片控件 4)  Button :单击事件

  • WinForm生成验证码图片的方法

    本文实例讲述了WinForm生成验证码图片的方法.分享给大家供大家参考,具体如下: 1.创建ValidCode类: public class ValidCode { #region Private Fields private const double PI = 3.1415926535897932384626433832795; private const double PI2 = 6.283185307179586476925286766559; //private readonly int

  • C#生成验证码图片的方法

    本文实例为大家分享了C#生成验证码图片的具体代码,供大家参考,具体内容如下 /// <summary> /// 生成验证码图片 /// </summary> /// <returns></returns> public byte[] GetVerifyCode() { int codeW = 80; int codeH = 40; int fontSize = 18; string chkCode = string.Empty; //颜色列表,用于验证码.噪

  • java生成验证码图片的方法

    本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下 示例一: import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import javax.imageio.ImageIO; import javax.servlet.http.HttpServ

  • python生成验证码图片代码分享

    本文实例为大家分享了python生成验证码图片代码,分享给大家供大家参考,具体内容如下 基本上大家使用每一种网络服务都会遇到验证码,一般是网站为了防止恶意注册.发帖而设置的验证手段.其生成原理是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR).下面就详细讲解如何生成验证码. 所需环境 除了配置好的python环境外,还需要配有python中的PIL库,这是python中专门用来处理图片的库.用传统的pip install 方法或者下载源码 python setup.

  • Python使用PIL库实现验证码图片的方法

    本文实例讲述了Python使用PIL库实现验证码图片的方法.分享给大家供大家参考,具体如下: 现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一.这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码.代码中有详细注释. #!/usr/bin/env python #coding=utf-8 import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _l

  • php生成圆角图片的方法

    本文实例讲述了php生成圆角图片的方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <?php $image_file = $_GET['src']; $corner_radius = isset($_GET['radius']) ? $_GET['radius'] : 20; // The default corner radius is set to 20px $topleft = (isset($_GET['topleft']) and $_GET['topleft'] ==

  • Javaweb开发中通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.response.study; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; i

  • 使用RoundedBitmapDrawable生成圆角图片的方法

    Bitmap src = BitmapFactory.decodeResource(getResources(), imageId); //获取Bitmap图片 RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), src); //创建RoundedBitmapDrawable对象 roundedBitmapDrawable.setCornerRadius

  • PHP实现生成模糊图片的方法示例

    本文实例讲述了PHP实现生成模糊图片的方法.分享给大家供大家参考,具体如下: <?php class image_blur{ /** * 图片高斯模糊(适用于png/jpg/gif格式) * @param $srcImg 原图片 * @param $savepath 保存路径 * @param $savename 保存名字 * @param $positon 模糊程度 * *基于Martijn Frazer代码的扩充, 感谢 Martijn Frazer */ public function g

  • Java使用Servlet生成验证码图片

    本文实例为大家分享了Java使用Servlet生成验证码图片的具体代码,供大家参考,具体内容如下 一.实现思路 1.使用BufferedImage用于在内存中存储生成的验证码图片 2.使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证 3.最后通过ImageIO将生成的图片进行输出 4.页面通过访问servlet来获取并展示验证码 5.在后台获取页面提交的验证码,然后和存放在session中的验证码进行比对,进行校验 二.生成验证码 生成验证码

随机推荐