笔记本Asp.netWebApi如何实现图片点击式图片验证码
日期:2018-03-06 23:26 作者:笔记本之家 来源:www.luobowin10.com
现在验证码的形式越来越丰富,今天要实现的是在点击图片中的文字来进行校验的验证码,如图
这种验证码验证是验证鼠标是否选中了图片中文字的位置,以及选择的顺序,产生验证码的时候可以提供一组底图,然后随机获取一张图片,随机选取几个字,然后把文字的顺序打乱,分别随机放到图片的一个位置上,然后记录文字的位置和顺序,验证的时候验证一下文字的位置和顺序即可
验证码图片的类
/// <summary> /// 二维码图片 /// </summary> public class VerCodePic { /// <summary> /// 图片链接 /// </summary> public string PicURL { get; set; } /// <summary> /// 第一个字位置 /// </summary> public FontPoint Font1 { get; set; } /// <summary> /// 第二个字位置 /// </summary> public FontPoint Font2 { get; set; } /// <summary> /// 第三个字位置 /// </summary> public FontPoint Font3 { get; set; } /// <summary> /// 第四个字位置 /// </summary> public FontPoint Font4 { get; set; } } /// <summary> /// 文字位置 /// </summary> public class FontPoint { public int X { get; set; } public int Y { get; set; } }
生成验证码图片验证码的方法,在这个方法中指定了生成的验证码图片中字体大小为20个像素,因为验证码底图的大小是固定的,所以就把验证码底图按照字体的大小分成了若干个网格位置,指定一个文字在图片中的位置时只需要随机获取其中一个网格即可,如果这个网格中没有指定过文字,那就把文字放到这个网格中。
提前设定网格的方法
private static ArrayList _FontPoint; public static ArrayList FontPoint { get { if (_FontPoint==null) { _FontPoint = new ArrayList(); for (int x=0;x<10;x++) { for (int y=0;y<5;y++) { _FontPoint.Add(new Models.FontPoint() { X = x * 28, Y = y * 20 }); } } } return _FontPoint; } }
我选定的验证码底图为280*100的,所以按照上边的方法将图片分成了若干个网格,在下边设定一个文字位置的时候随机选取其中一个位置,而且给每个字都设定了不一样的颜色
/// <summary> /// 根据文字和图片获取验证码图片 /// </summary> /// <param name="content"></param> /// <param name="picFileName"></param> /// <returns></returns> public static VerCodePic GetVerCodePic(string content,string picFileName,int fontSize=20) { ClassLoger.Info("FileHelper.GetVerCodePic","开始生成二维码"); Bitmap bmp = new Bitmap(picFileName); List<int> hlist = new List<int>(); VerCodePic codepic = new VerCodePic(); int i = Utils.GetRandom(0, SystemSet.FontPoint.Count - 1); codepic.Font1 = SystemSet.FontPoint[i] as FontPoint; hlist.Add(i); A: int i2 = Utils.GetRandom(0, SystemSet.FontPoint.Count - 1); if (hlist.Contains(i2)) goto A; codepic.Font2 = SystemSet.FontPoint[i2] as FontPoint; hlist.Add(i2); B: int i3 = Utils.GetRandom(0, SystemSet.FontPoint.Count - 1); if (hlist.Contains(i3)) goto B; hlist.Add(i3); codepic.Font3 = SystemSet.FontPoint[i3] as FontPoint; C: int i4 = Utils.GetRandom(0, SystemSet.FontPoint.Count - 1); if (hlist.Contains(i4)) goto C; hlist.Add(i4); codepic.Font4 = SystemSet.FontPoint[i4] as FontPoint;string fileName = (content + "-" + picFileName+"-"+i+"|"+i2+"|"+i3+"|"+i4).MD5()+Path.GetExtension(picFileName); string dir = Path.Combine(SystemSet.ResourcesPath, SystemSet.VerCodePicPath); string filePath = Path.Combine(dir, fileName); if (File.Exists(filePath)) { codepic.PicURL = string.Format("{0}/{1}/{2}", SystemSet.webResourcesSite, SystemSet.VerCodePicPath, fileName); return codepic; } if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } Graphics g = Graphics.FromImage(bmp); Font font = new Font("微软雅黑", fontSize, GraphicsUnit.Pixel); SolidBrush sbrush = new SolidBrush(Color.Black); SolidBrush sbrush1 = new SolidBrush(Color.Peru); SolidBrush sbrush2 = new SolidBrush(Color.YellowGreen); SolidBrush sbrush3 = new SolidBrush(Color.SkyBlue); List<char> fontlist = content.ToList(); ClassLoger.Info("FileHelper.GetVerCodePic", fontlist.Count.ToString()); g.DrawString(fontlist[0].TryToString(), font, sbrush, new PointF(codepic.Font1.X, codepic.Font1.Y)); g.DrawString(fontlist[1].TryToString(), font, sbrush1, new PointF(codepic.Font2.X, codepic.Font2.Y)); g.DrawString(fontlist[2].TryToString(), font, sbrush2, new PointF(codepic.Font3.X, codepic.Font3.Y)); g.DrawString(fontlist[3].TryToString(), font, sbrush3, new PointF(codepic.Font4.X, codepic.Font4.Y)); bmp.Save(filePath, ImageFormat.Jpeg); codepic.PicURL = string.Format("{0}/{1}/{2}",SystemSet.webResourcesSite, SystemSet.VerCodePicPath, fileName); return codepic; }
相关笔记本新闻资讯推荐
- 巧妙解决win10 64位系统错误0x000006d18 2018-08-14
- win10系统迅雷安装包点击无法打开安装或无效的图文技巧 2019-04-14
- win7系统启动黑屏错误0xc000025 BCd损坏故障的解决技巧 2019-03-16
- win7系统频繁重启的设置方案 2019-02-26
- win7系统电脑隔一段时间就断网的解决方案 2019-02-28
- 秘招解决win10 32位系统开机画面异常 2018-08-19
- win10系统能上网但图标显示未连接的操作方案 2019-04-16
- win10系统唤醒睡眠功能时电脑黑屏的还原教程 2019-04-15
- 电脑公司专业版微软推送Win101809RS5快速预览版17634镜像 2018-04-02
- 秋叶win8系统双击打不开jar文件怎么处理 2018-05-23
- win10系统计算机未响应的图文办法 2019-04-16
- win10系统启动dota2游戏出现steam client not found的设置办法 2019-04-15
- win10系统修改注册表解决电脑总弹出error提示框问题的处理步骤 2019-04-14
- win7系统恢复环境下选项丢失的修复方案 2019-03-05
- win10系统待机断网的处理技巧 2019-04-16
- win10系统任务栏无法锁定的处理步骤 2019-04-16
- win10系统总是内存不足的办法介绍 2019-04-16
- win10系统iE脚本错误的设置办法 2019-04-15
笔记本系统推荐
-
1笔记本Ghost Win10 x64(1809专业版)V2018.10(全网首发)
笔记本Win10 64位 /
系统下载 -
2笔记本 Ghost Win10 64位 纯净版 v2016.06(自动激活)
笔记本Win10纯净版 /
系统下载 -
3笔记本Ghost win10x86 稳定纯净版v2019.05(自动激活)
笔记本Win10纯净版 /
系统下载 -
4笔记本Ghost win10x86 最新纯净版2019.03月(永久激活)
笔记本Win10纯净版 /
系统下载 -
5笔记本Ghost Win10 x64 好用纯净版V2019.02月(永久激活)
笔记本Win10纯净版 /
系统下载 -
6笔记本Ghost Win10 X32位 快速装机版V201701(绝对激活)
笔记本Win10 32位 /
系统下载 -
7雨林木风 64位win7免激活旗舰版v2022.10
笔记本Win10 32位 /
系统下载 -
8笔记本Ghost Win10 32位 万能纯净版v2018.03(免激活)
笔记本Win10纯净版 /
系统下载
笔记本新闻资讯排行
- win7系统系统U盘格式化失败的恢复方法 2019-02-23
- win10系统安装sQL server提示重新启动计算机失败 2019-04-15
- win10系统笔记本刷完bios黑屏的图文办法 2019-04-15
- win10系统看不了GiF图片的解决技巧 2019-04-14
- win10系统网络适配器打不开的修复技巧 2019-04-14
- Win10 u青菜系统下载查看驱动是否完全安装的技巧 2018-03-03
- win10系统突然变成xp界面的处理技巧 2019-04-15
- win10系统下sfcscannow命令的使用方法 2018-12-22
- 剖析win10旗舰版系统桌面文件夹没有法被创建 2018-08-02
- win10系统笔记本电脑光驱打不开的技巧介绍 2019-04-13