WinForm生成验证码图片的方法

   2016-06-20 0
核心提示:这篇文章主要介绍了WinForm生成验证码图片的方法,涉及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举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • C#连接本地Access数据库及简单操作的winform小程序
    C#连接本地Access数据库及简单操作的winform小
    连接本地Access数据库及简单操作的winform小程序一、准备工作用Access创建一个数据库并创建一个表格。(对于非远程数据库,Access十分简单。表格可参考三、界面设计)。二、代码using System;using System.Collections.Generic;using System.ComponentModel;u
    02-09
  • 在Winform中播放视频等【DotNet,C#】
    在项目中遇到过这样的问题,就是如何在Winform中播放视频。当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单;第二种是利用DirectX直接在窗体或者控件上绘图,这种比较复杂。于是采用的是第一种方法。      先从VS的工具箱里
    02-09
  • NX二次开发-基于Winform界面对话框与NXOPEN C#交互的开发(对话框嵌套)
    NX二次开发-基于Winform界面对话框与NXOPEN C#
    一.用类库方式创建1.新建类库进来后编译代码,成功 添加NXOPEN的库到项目中   不同NX版本,可能dll所在位置不一样,NX11以上版本在NXBIN这里,NX11以下版本大概在UGII。 添加头文件using NXOpen;using NXOpen.Utilities;using NXOpen.UF; 2.添加winform
    02-09
  • c# WinForm开发 DataGridView控件的各种操作
    一、单元格内容的操作 *****// 取得当前单元格内容         Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index       Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); // 取得当前单元格的行 Index
    02-09
  • C#:winform项目在win7,xp32位和64位都能执行
    vs中项目配置管理器活动解决方式平台选择X86平台。
    02-09
  • C# Winform消息通知系统托盘气泡提示框ToolTip控件
    C# Winform消息通知系统托盘气泡提示框ToolTip
    目录气球状提示框的介绍和系统通知变化消息通知的提示ShowBalloonTip()方法及指定消息类型NotifyIcon属性设置消息BalloonTipIcon不同的消息类型ToolTipText属性ToolTip提示控件显式或主动的提示消息一个ToolTip同时为多个控件设置提示显式设置ToolTip气球状提
  • 详解C# WinForm如何实现自动更新程序
    详解C# WinForm如何实现自动更新程序
    目录前言开发环境开发工具实现代码实现效果前言在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。由于涉及到客户端文件,所以必然需要把相应的文件下载下来。这个其实比较常见,我们常用的微信、QQ
  • C# WinForm实现自动更新程序之客户端的示例代码
    C# WinForm实现自动更新程序之客户端的示例代
    目录前言开发环境开发工具实现代码实现效果前言第二步理论上我们该写客户端了,但是,在此之前,需要先介绍下一些必要的方法以及操作。写代码还是要尽量的保证通用性,以便以后需要的时候可以拿来稍微改改甚至直接使用。所以在这里我们将自动更新的程序抽象出
  • 分享一个基于winForm后台单线程推送多线程并行处理业务的小程序框架
    分享一个基于winForm后台单线程推送多线程并行
      在前面的文章中我曾分享了一个小程序框架,后来在这个框架基础上我把它改成了基于多线程并行处理的方式。这个小框架主要用于的场景是这样的:有时我们需要处理大量数据如来自数据库表的数据,有时还不能重复处理,如果我们用同步的方式逐条处理的话那么效
    02-09
  • C# winform Panel 添加 滚动条 cba赛程
    Detailed discussion here. Try this instead for 'only' scrolling vertical.(auto scroll needs to be false before it will accept changes)mypanel.AutoScroll = false;mypanel.HorizontalScroll.Enabled = false;mypanel.HorizontalScroll.Visible = f
    02-08
点击排行