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());
Winform中产生验证码图片的更多相关文章
- Trident内核中取验证码图片的几种方法
程序中用了IE的内核,想取出网站中的验证码图片,单独显示出来,调研了以下几路方法 1.枚举所有缓存文件,进行处理,找到想要的,核心代码 )//这段代码可以枚举所有缓存资源,然后对应做处理 { LPIN ...
- c# Winform中如何把图片添加到resources中
我们在Winform项目中中需要插入图片资源,但是新建的项目中找不到Resources文件夹,怎么才能出现呢? 1:双击项目下的Resources.resx,出现视图 2:单击"添加资源&q ...
- C#获取网页中的验证码图片(转载)
有时候我们需要获得网页上的图片,尤其是向验证码这样的图片.这个方法就是将网页上的图片获取到PictureBox中.效果入下图所示. 右边是使用Webbrowser控件装载的某网站的注册页面,其中包括了 ...
- 在Winform中怎么实现图片的旋转,比如说实现仪表盘功能,看代码吧,看太不懂的欢迎问
; //旋转的角度 //Timer定时器 private void timer1_Tick(object sender, EventArgs e) { timer1.Enabled = false; ...
- SpringMVC中controller返回图片(转)
本文转自:http://blog.csdn.net/u011637069/article/details/51112187 SpringMVC中controller通过返回ModelAndView然后 ...
- Winform中Picture控件图片的拖拽显示
注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...
- android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)
package net.yt.yuncare.widgets; import android.graphics.Bitmap; import android.graphics.Canvas; impo ...
- .Net中验证码图片生成
开发网站或平台系统,登录页面是必不可少的功能,但是现在很多人可以使用工具暴力破解网站密码,为了防止这类非法操作,需要在登录页面添加验证,验证码就是最常用的一种验证方式. 我结合了自己的经验和网上的验证 ...
- WPF和Winform中picturebox图片局部放大
原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...
随机推荐
- Linux signal 编程(转载)
转载地址:http://blog.sina.com.cn/s/blog_4b226b92010119l5.html 当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收 ...
- Pytho并发编程-利用协程实现简单爬虫
from gevent import monkey;monkey.patch_all() import gevent from urllib.request import urlopen def ge ...
- 一台电脑如何安装多个版本的JDK
1 . 准备两个版本的jdk我的两个jdk路径为: C:\Program Files\Java\jdk1.6.0_43 C:\Program Files\Java\jdk1.8.0_25 2 . ...
- MySQL 类型转换
1.问题描述 在项目中遇到要将Int类型转为Char类型,然后利用转化后的Char类型进行模糊查询. 例:合同编号在数据库中为int类型 8066 用利用 806 模糊查询出合同编号为8066数据记录 ...
- CSS基础-DAY1
CSS 概述CSS 指层叠样式表 (Cascading Style Sheets),样式定义了如何显示 HTML文件中的标签元素,CSS是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标 ...
- BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流
https://www.lydsy.com/JudgeOnline/problem.php?id=1449 给每条路加上一个权值,每条路的费用是这条路的流量*权值,求最大流的最小费用. 每次spfa记 ...
- BZOJ.2125.最短路(仙人掌 圆方树)
题目链接 圆方树.做题思路不写了.. 就是当LCA是方点时跳进那个环可以分类讨论一下用树剖而不必须用倍增: 如果v是u的(唯一的那个)重儿子,那么u的DFS序上+1的点即是要找的:否则v会引出一条新的 ...
- 属性通知之ObservableCollection
单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...
- tyvj 1004 滑雪 记忆化搜索
滑雪 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.tyvj.cn/p/1004 Description trs喜欢滑雪.他来 ...
- HDU 4268 Alice and Bob 贪心STL O(nlogn)
B - Alice and Bob Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...