先看一个核心验证码类(不用在意实现过程,直接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. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

  2. 个人知识点总结——Java并发

    Java并发实在是一个非常深的问题,这里仅仅简单记录一下Java并发的知识点.水太深.假设不花大量的时间感觉全然hold不住,可是眼下的精力全然不够,兴趣也不在这 什么是线程安全性 某个类的行为和其规 ...

  3. How to Sign in as a Different User in SharePoint 2013

    SharePoint used to have a menu option called "Sign in as Different User" in the top-right ...

  4. [Git] Undo my last commit and split it into two separate ones

    When you accidentally committed some changes to your branch you have various possibilities to “undo” ...

  5. JavaScript 闭包(个人理解)

    当function里嵌套function时,内部的function可以访问外部function里的变量.但这不是闭包 function foo(x) { var tmp = 3; function b ...

  6. 详解使用DockerHub官方的mysql镜像生成容器

    详解使用DockerHub官方的mysql镜像生成容器 收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!&g ...

  7. REP report开发技巧

    其他文章 报表开发介绍 posted @ 2017-02-23 18:525 by Mark

  8. WritePrivateProfileString GetPrivateProfileString 读取写 配置文件

    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfi ...

  9. RN组件备忘录

    1:ActivityIndicator:圆形的loading提示符号. 2:Button:按钮 3:FlatList:高性能列表组件,支持下拉刷新. 4:Image:图片组件,能显示 网络图片.静态资 ...

  10. openerp学习笔记 视图继承(tree、form、search)

    支持的视图类型:form.tree.search ... 支持的定位方法:                  <notebook position="inside"> ...