一、生成随机字符串

 方法一:

  1. public string CreateRandomCode(int codeCount)
  2. {
  3. string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,a,b,c,d,e,f,g,h,i,g,k,l,m,n,o,p,q,r,F,G,H,I,G,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,s,t,u,v,w,x,y,z";
  4. string[] allCharArray = allChar.Split(',');
  5. string randomCode = ""; //声明随机字符串变量
  6. int temp = -;
  7. Random rand = new Random(); //声明随机数对象
  8. for (int i = ; i < codeCount; i++)
  9. {
  10. if (temp != -)
  11. {
  12. rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
  13. }
  14. int t = rand.Next();
  15. if (temp == t)
  16. {
  17. return CreateRandomCode(codeCount);
  18. }
  19. temp = t;
  20. randomCode += allCharArray[t];
  21. }
  22. return randomCode;
  23. }

 方法二:

  1. private static string GetRandomString(int length)
  2. {
  3. return Guid.NewGuid().ToString("N").Substring(( - length), length);
  4. }

二、创建验证码图片

 实现方法一:

  1. public byte[] CreateValidateGraphic(string validateCode)
  2. {
  3. //声明用于处理由像素数据定义的图像的对象(宽,高)
  4. Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 16.0), );
  5.  
  6. Graphics g = Graphics.FromImage(image);
  7. try
  8. {
  9. Random random = new Random();
  10.  
  11. g.Clear(Color.White); //清空图片背景色
  12.  
  13. //画图片的干扰线
  14. for (int i = ; i < ; i++)
  15. {
  16. int x1 = random.Next(image.Width);
  17. int x2 = random.Next(image.Width);
  18. int y1 = random.Next(image.Height);
  19. int y2 = random.Next(image.Height);
  20. g.DrawLine(new Pen(Color.Silver), x1, x2, y1, y2);
  21. }
  22.  
  23. Font font = new Font("Arial", , (FontStyle.Bold | FontStyle.Italic)); //设置字体样式和大小
  24. LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(, , image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
  25. g.DrawString(validateCode, font, brush, , ); //绘制指定的字符串
  26.  
  27. //画图片的前景干扰线
  28. for (int i = ; i < ; i++)
  29. {
  30. int x = random.Next(image.Width);
  31. int y = random.Next(image.Height);
  32. image.SetPixel(x, y, Color.FromArgb(random.Next()));
  33. }
  34.  
  35. g.DrawRectangle(new Pen(Color.Silver), , , image.Width - , image.Height - ); //画图片的边框线
  36.  
  37. //保存图片数据
  38. MemoryStream stream = new MemoryStream();
  39. image.Save(stream, ImageFormat.Jpeg);
  40.  
  41. //输出图片流
  42. return stream.ToArray();
  43. }
  44. finally
  45. {
  46. g.Dispose();
  47. image.Dispose();
  48. }
  49. }

 实现方法二:

  1. /// <summary>
  2. /// 由随机字符串,随即颜色背景,和随机线条产生的Image
  3. /// </summary>
  4. /// <returns>Image</returns>
  5. public static byte[] GetVcodeImg(string text, int width = , int height = , int fontSize = )
  6. //返回 Image
  7. {
  8. int charNum = text.Length;
  9. //声明一个位图对象
  10. Bitmap bitMap = null;
  11. //声明一个绘图画面
  12. Graphics gph = null;
  13. //创建内存流
  14. MemoryStream memStream = new MemoryStream();
  15. Random random = new Random();
  16. //由给定的需要生成字符串中字符个数 CharNum, 图片宽度 Width 和高度 Height 确定字号 FontSize,
  17. //确保不因字号过大而不能全部显示在图片上
  18. int fontWidth = (int)Math.Round(width / (charNum + ) / 1.3);
  19. int fontHeight = (int)Math.Round(height / 1.5);
  20. //字号取二者中小者,以确保所有字符能够显示,并且字符的下半部分也能显示
  21. fontSize = fontWidth <= fontHeight ? fontWidth : fontHeight;
  22. //创建位图对象
  23. bitMap = new Bitmap(width + fontSize, height);
  24. //根据上面创建的位图对象创建绘图图面
  25. gph = Graphics.FromImage(bitMap);
  26. //设定验证码图片背景色
  27. gph.Clear(GetControllableColor());
  28. //产生随机干扰线条
  29. for (int i = ; i < ; i++)
  30. {
  31. Pen backPen = new Pen(GetControllableColor(), );
  32. //线条起点
  33. int x = random.Next(width);
  34. int y = random.Next(height);
  35. //线条终点
  36. int x2 = random.Next(width);
  37. int y2 = random.Next(height);
  38. //划线
  39. gph.DrawLine(backPen, x, y, x2, y2);
  40. }
  41. //定义一个含10种字体的数组
  42. String[] fontFamily =
  43. {
  44. "Arial", "Verdana", "Comic Sans MS", "Impact", "Haettenschweiler",
  45. "Lucida Sans Unicode", "Garamond", "Courier New", "Book Antiqua", "Arial Narrow"
  46. };
  47.  
  48. SolidBrush sb = new SolidBrush(GetControllableColor());
  49. //通过循环,绘制每个字符,
  50. for (int i = ; i < text.Length; i++)
  51. {
  52. Font textFont = new Font(fontFamily[random.Next()], fontSize, FontStyle.Bold); //字体随机,字号大小30,加粗
  53. //每次循环绘制一个字符,设置字体格式,画笔颜色,字符相对画布的X坐标,字符相对画布的Y坐标
  54. int space = (int)Math.Round((double)((width - fontSize * (charNum + )) / charNum));
  55. //纵坐标
  56. int y = (int)Math.Round((double)((height - fontSize) / ));
  57. gph.DrawString(text.Substring(i, ), textFont, sb, fontSize + i * (fontSize + space), y);
  58. }
  59. //扭曲图片
  60. bitMap = TwistImage(bitMap, true, random.Next(, ), random.Next());
  61.  
  62. bitMap.Save(memStream, ImageFormat.Gif);
  63.  
  64. bitMap.Dispose();
  65.  
  66. return memStream.ToArray();
  67. }
  68.  
  69. /// <summary>
  70. /// 产生一种 R,G,B 均大于 colorBase 随机颜色,以确保颜色不会过深
  71. /// </summary>
  72. /// <returns>背景色</returns>
  73. private static Color GetControllableColor(int colorBase)
  74. {
  75. Color color = Color.Black;
  76.  
  77. Random random = new Random();
  78. //确保 R,G,B 均大于 colorBase,这样才能保证背景色较浅
  79. color = Color.FromArgb(random.Next() + colorBase, random.Next() + colorBase, random.Next() + colorBase);
  80. return color;
  81. }
  82.  
  83. /// <summary>
  84. /// 扭曲图片
  85. /// </summary>
  86. /// <param name="srcBmp"></param>
  87. /// <param name="bXDir"></param>
  88. /// <param name="dMultValue"></param>
  89. /// <param name="dPhase"></param>
  90. /// <returns></returns>
  91. private static Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
  92. {
  93. int leftMargin = ;
  94. int rightMargin = ;
  95. int topMargin = ;
  96. int bottomMargin = ;
  97.  
  98. float PI2 = 6.28318530717959f;
  99. Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
  100. double dBaseAxisLen = bXDir ? Convert.ToDouble(destBmp.Height) : Convert.ToDouble(destBmp.Width);
  101. for (int i = ; i < destBmp.Width; i++)
  102. {
  103. for (int j = ; j < destBmp.Height; j++)
  104. {
  105. double dx = ;
  106. dx = bXDir ? PI2 * Convert.ToDouble(j) / dBaseAxisLen : PI2 * Convert.ToDouble(i) / dBaseAxisLen;
  107. dx += dPhase;
  108. double dy = Math.Sin(dx);
  109. //取得当前点的颜色
  110. int nOldX = ;
  111. int nOldY = ;
  112. nOldX = bXDir ? i + Convert.ToInt32(dy * dMultValue) : i;
  113. nOldY = bXDir ? j : j + Convert.ToInt32(dy * dMultValue);
  114. var color = srcBmp.GetPixel(i, j);
  115. if (nOldX >= leftMargin && nOldX < destBmp.Width - rightMargin && nOldY >= bottomMargin &&
  116. nOldY < destBmp.Height - topMargin)
  117. {
  118. destBmp.SetPixel(nOldX, nOldY, color);
  119. }
  120. }
  121. }
  122. return destBmp;
  123. }

三、将 8位字节数组 转换为 base64字符串 类型的数据

  1. private String BytesToBase64(Byte[] bytes)
  2. {
  3. try
  4. {
  5. return Convert.ToBase64String(bytes);
  6. }
  7. catch
  8. {
  9. return null;
  10. }
  11. }

四、接口与调用

  本例是在网站中通过 ashx 文件写的

调用以上三个方法:

  1. public void ProcessRequest(HttpContext context)
  2. {
  3. context.Response.ContentType = "text/plain";
  4. StrHelper sh = new StrHelper(context);    //自己写的类,这里用来返回json数据
  5.  
  6. string code = CreateRandomCode();       //验证码的字符为4个
  7. string image = BytesToBase64(CreateValidateGraphic(code));    //将图片验证码用base64类型的字符串返回(便于前端显示)
  8. sh.RebackJson(new { status = , code = code, image = image, type = "image/Jpeg" });
  9. }

在页面中调用:

  1. <a >
  2. <img id="img1" src="" onclick="changeImage()"/>
  3. </a>
  4. <script src="~/Scripts/jquery-1.10.2.js"></script>
  5. <script>
  6. window.onload = function () {
  7. changeImage();
  8. }
  9. function changeImage() {
  10. $.ajax({
  11. url: "http://服务器地址:端口号/SecurityCode.ashx",
  12. type: "post",
  13. success: function (data) {
  14. data = JSON.parse(data);
  15.  
  16. console.log(data);
  17. $("#img1").attr("src", 'data:image/png;base64,' + data.image);
  18. },
  19. error: function (data) { },
  20. })
  21. }
  22. </script>

实现方式二 -- 存储到 Redis 缓存中

  1. /// <summary>
  2. /// 生成验证码
  3. /// </summary>
  4. /// <returns></returns>
  5. public static async Task<VCode_Return> GetCodeAsync()
  6. {
  7. //生成数字并保存,将和图片的base64返回
  8. var text = GetRandomString();
  9.  
  10. string vid = ObjectId.GenerateNewId().ToString();
  11.  
  12. //存储缓存
  13. await Redis.TopOauth.StringSetAsync($"VCODE:{vid}", text.ToLower(), new TimeSpan(, , ));
  14.  
  15. var bytes = GetVcodeImg(text);
  16. //生成图片
  17. string imgbase64 = Convert.ToBase64String(bytes);
  18. //返回验证码
  19. VCode_Return myReturn = new VCode_Return { vcode_image = imgbase64, vcodeid = vid };
  20. return myReturn;
  21. }

1

生成图片验证码(.NET)的更多相关文章

  1. PHP生成图片验证码demo【OOP面向对象版本】

    下面是我今天下午用PHP写的一个生成图片验证码demo,仅供参考. 这个demo总共分为4个文件,具体代码如下: 1.code.html中的代码: <!doctype html> < ...

  2. python 全栈开发,Day85(Git补充,随机生成图片验证码)

    昨日内容回顾 第一部分:django相关 1.django请求生命周期 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这 ...

  3. net生成图片验证码--转自Lisliefor

    目前,机器识别验证码已经相当强大了,比较常见的避免被机器识别的方法,就是将验证码的字符串连到一起,这样就加大的识别的难度,毕竟机器没有人工智能.我找了很多的.net生成图片验证码的例子,后来经过一些修 ...

  4. python PIL图像处理-生成图片验证码

    生成效果如图: 代码 from PIL import Image,ImageDraw,ImageFont,ImageFilter import random # 打开一个jpg图像文件: im = I ...

  5. 在.net core web项目中生成图片验证码

    第1步:添加SkiaSharp包引用 Install-Package SkiaSharp 第2步:编写生成图片验证码的代码 using SkiaSharp; //在类文件头部添加引用 public I ...

  6. 【转载】Asp.Net生成图片验证码工具类

    在Asp.Net应用程序中,很多时候登陆页面以及其他安全重要操作的页面需要输入验证码,本文提供一个生成验证码图片的工具类,该工具类通过随机数生成验证码文本后,再通过C#中的图片处理类位图类,字体类,一 ...

  7. js依赖mui.css生成图片验证码

    js依赖mui.css生成图片验证码 相关css和js引入路径 https://cdnjs.cloudflare.com/ajax/libs/mui/3.7.1/css/mui.css https:/ ...

  8. (七)利用servlet生成图片验证码

    总结: 验证码就是一张图,然后往这张图上写入随机的字符(数字字母等). 1.1 编写html页面 <!DOCTYPE html> <html> <head> < ...

  9. PIL实现图片框架以及生成图片验证码

    1. PIL的基本概念 PIL:即Python Imaging Library,是Python平台事实上的图像处理标准库. PIL中涉及通道(bands)和模式(mode)这两个重要概念. (1)通道 ...

  10. Django登录(含随机生成图片验证码)注册实例

    登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...

随机推荐

  1. C++结构体字节对齐

    转自:http://www.cnblogs.com/JensenCat/p/4770171.html 这里是头文件结构的定义: 一个非字节对齐结构体_tagTest2 一个字节对齐_tagTest3 ...

  2. iOS开发-OpenGL ES入门教程1

    http://www.jianshu.com/p/750fde1d8b6a 这里是一篇新手教程,环境是Xcode7+OpenGL ES 2.0,目标写一个OpenGL ES的hello world.O ...

  3. 冒泡排序法原理讲解及PHP代码示例

    冒泡排序原理 冒泡排序对一个数组里的数字进行排序,把数组里两个相邻的数比较大小,将值小的数放在前面,把大的数往后面放,当然这种排序是升序,即从小到大.举例说明$array = [64, 56, 31, ...

  4. P1283 平板涂色

    P1283 平板涂色 dfs 记忆化搜索 将矩阵转化为图求解,然后我们发现这是个DAG,于是就可以愉快地跑搜索了. 进行dfs时,我们可以用类似拓扑排序的方法.每次将上面所有矩形都被刷过(入度in[ ...

  5. 轻量级文本标记语言-Markdown

    Markdown简介 接触过github的都知道,在发布项目的时候可以建立一个说明文件README.md,这个md文件就是Markdown文本编辑语言的文件. Markdown 是一种轻量级标记语言, ...

  6. C 运算优先级口诀

    运算优先级口诀: 括号成员第一;        //括号运算符[]() 成员运算符.  ->  全体单目第二;        //所有的单目运算符比如!.~.++. --. +(正). -(负) ...

  7. 20145318《网络对抗》Web安全基础实践

    20145318<网络对抗>Web安全基础实践 基础问题回答 1.SQL注入原理,如何防御 SQL注入 就是通过把SQL命令插入到“Web表单递交”或“输入域名”或“页面请求”的查询字符串 ...

  8. VC++ 利用CreateFile、ReadFile和WriteFile实现CopyFile

    1. CreateFile:这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 参照:http://www.cppblo ...

  9. 第一个html文件

    1.新建记事本文件,后缀改为.html 2.添加: <html>  <head>  <title>jude`s first web</title>  & ...

  10. MAC BOOK Air 安装metasploit-framework

    Step 1:Xcode命令行开发工具OS X确保它已经安装了Xcode开发工具,在终端执行: xcode-select --install1Step 2:Java SDK安装Java sdk,不能用 ...