其实和winform中的实现差不多,只是由于WPF中控件使用的库与winform中的有区别,大体上还是差不多的,直接看代码:

产生验证码的类:ValidCode.cs

public class ValidCode{#region Private Fieldsprivate 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 Propertypublic 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 Fieldpublic enum CodeType { Words, Numbers, Characters, Alphas }#endregion#region Private Methodsprivate 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 Methodspublic 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}

View Code

窗体中的代码:

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

其中image1是wpf中的图片控件.

转载于:https://www.cnblogs.com/tianguook/p/4142346.html

WPF中实现验证码功能相关推荐

  1. 传奇服务器设置验证码,如何设置传奇验证码功能

    对于在传奇私服中的验证码功能的设置方法今天我来给大家详细的说明一下,如果想要在自己的私服中实现这个验证码效果的话就仔细看下面的设置步骤说明. 在进行这个功能的设置之前首先需要大家来了解一下设置需要满足 ...

  2. web网页中的验证码实现

    前言 技巧点总结非常重要,等到在自己做项目中突然想用到了,可以来看看自己的博客,算是积累自己代码库的一种方式.下面小编对于牛腩新闻系统中的"验证码功能"方法做一下总结. 一.代码段 ...

  3. php的验证码要gd库,怎么在PHP中使用GD库实现一个验证码功能

    怎么在PHP中使用GD库实现一个验证码功能 发布时间:2021-02-15 08:16:44 来源:亿速云 阅读:83 作者:Leah 本篇文章给大家分享的是有关怎么在PHP中使用GD库实现一个验证码 ...

  4. wpf中xps文档合并功能实现

    原文:wpf中xps文档合并功能实现 跟着上一篇的xps文档套打的文章,近期一直在研究xps打印技术,其中用户提到了一个需求,要求能够多页面进行打印,我的想法是,先生成xps文件,然后将文件读取出来以 ...

  5. 手机直播系统开发中关于iOS获取图形验证码功能

    在手机直播系统开发中关于iOS获取图形验证码功能介绍,首先进入注册页面后请求图形验证码接口获取图形验证码的数字组合,然后加载到相应的页面上,在图形验证码页面我们定义了几个属性,字符串的数量.显示的线条 ...

  6. 如何实现游戏陪玩系统源码中注册验证码的自动填写功能

    新用户在注册登录游戏陪玩系统源码时往往需要进行短信验证,如果没有验证码自动填写功能则需要用户自行切换软件进行填写,无异于增添了许多步骤,会影响到用户的使用体验,所以今天我们主要来说一说如何实现游戏陪玩 ...

  7. php mysql设计中验证码的实现_php如何实现验证码功能

    PHP通过GD库实现验证码功能,结合实例形式分析了php验证码相关图片绘制.输出操作实现技巧.分享给大家供大家参考,具体如下: 首先看看实现的效果:(推荐学习:PHP视频教程) 具体实现:<?p ...

  8. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  9. html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能

    使用织梦Dedecms自定义表单的时候,即使你做了字段的验证,也很有可能被人刷很多垃圾的内容,更加安全的一个方法是为自定义表单添加上验证码功能.今天我就来为大家分享一下怎样给自定义表单添加验证码! 一 ...

最新文章

  1. 如何为Android上的产品设计一款合适的图标
  2. 用Transformer实现OCR字符识别!
  3. oracle增量备份如何恢复,【Oracle】增量备份和全库备份怎么恢复数据库
  4. php实现上传图片保存到数据库的方法
  5. oracle调度不见了,Oracle作业job 没有自动调度起来
  6. P1991-无线通讯网【最小生成树,瓶颈生成树】
  7. nylon尼龙的来历
  8. 简单php修改mysql数据类型_MySQL入门很简单—MySQL数据类型
  9. BraftEditor:React使用编辑器编辑的时候,在服务器上删除文字中不存在的图片
  10. X站全称是什么_哔哩哔哩:b站的由来、233娘的拜年祭、霸屏的雷姆、站内界面变化...
  11. 通过网易云API爬取评论
  12. Gdevops广州站:主流数据库的选型、架构设计与迁移实战,一网打尽!
  13. 天天向上python题目答案_Python练习:天天向上的力量
  14. pythoninput算出bmi_python菜鸡——BMI计算
  15. 如何判断和删除Orphaned site collections?
  16. 软件测试工程师面试题汇总
  17. 双非一本考研国防科技大学计算机,【收藏】40所不歧视本科 保护一志愿院校 含多所985/211!...
  18. java 基础知识(不定期更新)
  19. android系统wifi控制风扇,无线远程遥控风扇设计实现
  20. 无刷电机和有刷电机对比

热门文章

  1. 位图bitmap数据结构
  2. IntelliJ IDEA教程之如何clean或者install Maven项目
  3. (Integer) 128 == (Integer) 128 为false详细解读
  4. 后端 消息 转发_【后端开发】Servlet怎么转发
  5. springboot 数据库链接池常用配置
  6. docker中部署Redis
  7. Felgo之初体验--安装与运行
  8. 2014年世界互联网大会---马云篇
  9. 提高mysql查询速度_如何提高数据库查询速度
  10. 三维数据平滑处理_你该如何正确的处理思看科技三维扫描仪得到的数据?