先看一个核心验证码类(不用在意实现过程,直接copy就行),下面包含了两种验证码图片(原理一样),代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.IO;
  8. using System.Drawing.Imaging;
  9. namespace TyMall.Util
  10. {
  11. public class Yzm : System.Web.UI.Page
  12. {
  13. #region 生成4个随机数
  14. public string RandCode()
  15. {
  16. int CodeCount = 4;//生成4个随机数
  17. string randomChar = "2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
  18. randomChar = randomChar.Replace(",", "");
  19. string RandomCode = "";
  20. System.Threading.Thread.Sleep(3);
  21. char[] allCharArray = randomChar.ToCharArray();
  22. int n = allCharArray.Length;
  23. System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
  24. for (int i = 0; i < CodeCount; i++)
  25. {
  26. int rnd = random.Next(0, n);
  27. RandomCode += allCharArray[rnd];
  28. }
  29. return RandomCode;
  30. }
  31. #endregion
  32. #region 验证码--方式1
  33. ///  <summary>
  34. ///  验证码--方式1 创建验证码图片
  35. ///  </summary>
  36. ///  <param  name="randomcode">验证码</param>
  37. public byte[] CreateImage(string randomcode)
  38. {
  39. int randAngle = 40; //随机转动角度
  40. int mapwidth = (int)(randomcode.Length * 18);
  41. Bitmap map = new Bitmap(mapwidth, 24);//创建图片背景
  42. Graphics graph = Graphics.FromImage(map);
  43. graph.Clear(Color.White);//清除画面,填充背景
  44. //graph.DrawRectangle(new Pen(Color.Silver, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
  45. Random rand = new Random();
  46. //验证码旋转,防止机器识别
  47. char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组
  48. //文字距中
  49. StringFormat format = new StringFormat(StringFormatFlags.NoClip);
  50. format.Alignment = StringAlignment.Center;
  51. format.LineAlignment = StringAlignment.Center;
  52. //定义颜色
  53. Color[] c = { Color.Black, Color.Red, Color.Blue, Color.Green,
  54. Color.Orange, Color.Brown, Color.DarkBlue };
  55. //画图片的背景噪音线
  56. for (int i = 0; i < 2; i++)
  57. {
  58. int x1 = rand.Next(10);
  59. int x2 = rand.Next(map.Width - 10, map.Width);
  60. int y1 = rand.Next(map.Height);
  61. int y2 = rand.Next(map.Height);
  62. graph.DrawLine(new Pen(c[rand.Next(7)]), x1, y1, x2, y2);
  63. }
  64. for (int i = 0; i < chars.Length; i++)
  65. {
  66. int cindex = rand.Next(7);
  67. int findex = rand.Next(5);
  68. Font f = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Regular);//字体样式(参数2为字体大小)
  69. Brush b = new System.Drawing.SolidBrush(c[cindex]);
  70. Point dot = new Point(12, 16);
  71. float angle = rand.Next(-randAngle, randAngle);//转动的度数
  72. graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
  73. graph.RotateTransform(angle);
  74. graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
  75. graph.RotateTransform(-angle);//转回去
  76. graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置
  77. }
  78. //生成图片
  79. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  80. MemoryStream stream = new MemoryStream();
  81. map.Save(stream, ImageFormat.Jpeg);
  82. graph.Dispose();
  83. map.Dispose();
  84. return stream.ToArray();
  85. }
  86. #endregion
  87. #region 验证码--方式2
  88. /// <summary>
  89. /// 验证码--方式2
  90. /// </summary>
  91. /// <param name="chkCode">验证码</param>
  92. /// <returns></returns>
  93. public Byte[] CreateImage2(string chkCode)
  94. {
  95. //颜色列表,用于验证码、噪线、噪点
  96. Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
  97. //字体列表,用于验证码
  98. string[] font = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
  99. Random rnd = new Random();
  100. Bitmap bmp = new Bitmap(100, 40);
  101. Graphics g = Graphics.FromImage(bmp);
  102. g.Clear(Color.White);
  103. //画噪线
  104. for (int i = 0; i < 3; i++)
  105. {
  106. int x1 = rnd.Next(100);
  107. int y1 = rnd.Next(40);
  108. int x2 = rnd.Next(100);
  109. int y2 = rnd.Next(40);
  110. Color clr = color[rnd.Next(color.Length)];
  111. g.DrawLine(new Pen(clr), x1, y1, x2, y2);
  112. }
  113. //画验证码字符串
  114. for (int i = 0; i < chkCode.Length; i++)
  115. {
  116. string fnt = font[rnd.Next(font.Length)];
  117. Font ft = new Font(fnt, 18);
  118. Color clr = color[rnd.Next(color.Length)];
  119. g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 + 8, (float)8);
  120. }
  121. //画噪点
  122. for (int i = 0; i < 20; i++)
  123. {
  124. int x = rnd.Next(bmp.Width);
  125. int y = rnd.Next(bmp.Height);
  126. Color clr = color[rnd.Next(color.Length)];
  127. bmp.SetPixel(x, y, clr);
  128. }
  129. MemoryStream ms = new MemoryStream();
  130. try
  131. {
  132. bmp.Save(ms, ImageFormat.Png);
  133. return ms.ToArray();
  134. }
  135. finally
  136. {
  137. //显式释放资源
  138. bmp.Dispose();
  139. g.Dispose();
  140. }
  141. }
  142. #endregion
  143. }
  144. }

然后需要在控制器中实现访问的方式(其实就是写一个action,把生成的image文件返回给view)

  1. /// <summary>
  2. /// 验证码,形状一
  3. /// </summary>
  4. /// <returns></returns>
  5. public ActionResult Yzm()
  6. {
  7. TyMall.Util.Yzm sc = new TyMall.Util.Yzm();
  8. string vVerificationCode = sc.RandCode();
  9. Session["vcode"] = null;
  10. Session("vcode", vVerificationCode.ToLower());   //Session中保存验证码
  11. sc.CreateImage(vVerificationCode);
  12. return File(sc.CreateImage(vVerificationCode), @"image/jpeg");
  13. }
  14. /// <summary>
  15. ///验证码,形状二
  16. /// </summary>
  17. /// <returns></returns>
  18. public ActionResult Yzm2()
  19. {
  20. TyMall.Util.Yzm sc = new TyMall.Util.Yzm();
  21. string vVerificationCode = sc.RandCode();
  22. Session["vcode"] = null;
  23. Session("vcode", vVerificationCode.ToLower());   //Session中保存验证码
  24. sc.CreateImage(vVerificationCode);
  25. return File(sc.CreateImage2(vVerificationCode), @"image/jpeg");
  26. }

view中访问方式(就是image的最原始展示方式)

    1. <img id="yzm" src="/控制器名称/yzm" />
    2. <img id="yzm" src="/控制器名称/yzm2" />

一个MVC4 下的验证码用法的更多相关文章

  1. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

    本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...

  2. xss其他标签下的js用法总结大全

    前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓           Default <script src=js地址></script> 1 <scr ...

  3. 快速入门系列--WebAPI--04在老版本MVC4下的调整

    WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...

  4. 一个CSS中Z-index的用法

    一个CSS中Z-index的用法 CSS教程:彻底掌握Z-index属性     大多数的CSS属性都很容易使用.常常,当您对标记语言的元素使用CSS属性时,产生的结果会随着您刷新页面而立即呈现.而另 ...

  5. ava下static关键字用法详解

    Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...

  6. 一个漂亮的php验证码类

    一个漂亮的php验证码类(分享)   作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下   直接上代码: 复制代码 代码如下: //验证 ...

  7. StringBuilder在高性能场景下的正确用法

    转载:<StringBuilder在高性能场景下的正确用法> by 江南白衣 关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不 ...

  8. select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表

    好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...

  9. centos 7 下图形验证码乱码

    工作中遇到一个问题:同样的代码在centos 6.5下图形验证码是正常的 但是在centos 7下面是乱码 centos 6.5 的系统字体库目录 [wwwad@P2P-test2 fonts]$ p ...

随机推荐

  1. Jquery的分页插件

    Jquery的分页插件, 用起来还不错. 来自: http://flaviusmatis.github.io/simplePagination.js/   下载地址: https://github.c ...

  2. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  3. linux 查找文件或者服务

    [root@localhost ~]# whereis mysql mysql: /usr/bin/mysql /usr/lib/mysql /usr/share/mysql /usr/share/m ...

  4. Linux 远程和本地的一些解决方式

     有的小伙伴想Linux 远程登录 两台机器同一时候root登录.事实上能够同一时候多个用户的. Linux是多用户的多任务系统,能够同一时候多个用户登录到系统,也能够一个用户通过不同终端登录到一个系 ...

  5. 解决Jquery向页面append新元素之后事件的绑定问题

    /*经过用户技能标签增加样式*/ $(".s-edited").live("hover",function(){ $(this).toggleClass(&qu ...

  6. 使用Jmeter对API进行性能测试

    先补充刚才测试的部分截图余下,后续详细补充内容. API Test.jmx 如下: <?xml version="1.0" encoding="UTF-8" ...

  7. 微软BI 之SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表

    基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 ...

  8. Microsoft® SQL Server® 2008 Express with Tools

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=22973

  9. 解决Visio复制绘图时虚框变实框的问题

    参考:http://www.educity.cn/help/653700.html 问题好像是,在VISIO里只要虚线框的大小超过一个界限,拷贝之后就会变成实线框. 解决办法是修改注册表:[运行reg ...

  10. linux2.6.30.4内核移植(6)——移植应用程序hello world常见的错误:-bin/sh ./hello not found

    通常在开发板上搭建好开发平台后,我们会试着移植一个最简单的应用程序Hello world来测试一下.初次尝试,我们经常会碰到的问题就是,在开发板上运行./hello的时候出错:-bin/sh ./he ...