前言

图片验证码是我们日常经常用到的,本文将介绍如何实现以及其原理,并没有过多注重css样式(有些简陋)。如果对滑块验证码感兴趣的可以看这篇文章:滑块验证码实现及原理

实现

主要是利用canvas画布加上随机字母,以及适当的旋转,移动,颜色。这一块主要利用的是css3的内容。

对于代码看不懂的可以看注释,注释标注的很详细。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>图片验证码</title>
</head><body><canvas id="canvas" width="120" height="40"></canvas><input type="text" id="text"><input type="button" value="提交" id="bt"><script>var canvas = document.getElementById("canvas");//演员var context = canvas.getContext("2d");//舞台,getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。var button = document.getElementById("bt");//获取按钮var input = document.getElementById("text");//获取输入框draw();canvas.onclick = function () {context.clearRect(0, 0, 120, 40);//在给定的矩形内清除指定的像素draw();}// 随机颜色函数function getColor() {var r = Math.floor(Math.random() * 256);var g = Math.floor(Math.random() * 256);var b = Math.floor(Math.random() * 256);return "rgb(" + r + "," + g + "," + b + ")";}function draw() {context.strokeRect(0, 0, 120, 40);//绘制矩形(无填充)var aCode = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];// 绘制字母var arr = [] //定义一个数组用来接收产生的随机数var num //定义容器接收验证码for (var i = 0; i < 4; i++) {var x = 20 + i * 20;//每个字母之间间隔20var y = 20 + 10 * Math.random();//y轴方向位置为20-30随机var index = Math.floor(Math.random() * aCode.length);//随机索引值var txt = aCode[index];context.font = "bold 20px 微软雅黑";//设置或返回文本内容的当前字体属性context.fillStyle=getColor();//设置或返回用于填充绘画的颜色、渐变或模式,随机context.translate(x,y);//重新映射画布上的 (0,0) 位置,字母不可以旋转移动,所以移动容器var deg=90*Math.random()*Math.PI/180;//0-90度随机旋转context.rotate(deg);//     旋转当前绘图context.fillText(txt, 0, 0);//在画布上绘制“被填充的”文本context.rotate(-deg);//将画布旋转回初始状态context.translate(-x,-y);//将画布移动回初始状态arr[i] = txt //接收产生的随机数}num = arr[0] + arr[1] + arr[2] + arr[3] //将产生的验证码放入num// 绘制干扰线条for (var i = 0; i < 8; i++) {context.beginPath();//起始一条路径,或重置当前路径context.moveTo(Math.random() * 120, Math.random() * 40);//把路径移动到画布中的随机点,不创建线条context.lineTo(Math.random() * 120, Math.random() * 40);//添加一个新点,然后在画布中创建从该点到最后指定点的线条context.strokeStyle=getColor();//随机线条颜色context.stroke();//   绘制已定义的路径}// 绘制干扰点,和上述步骤一样,此处用长度为1的线代替点for (var i = 0; i < 20; i++) {context.beginPath();var x = Math.random() * 120;var y = Math.random() * 40;context.moveTo(x, y);context.lineTo(x + 1, y + 1);context.strokeStyle=getColor();context.stroke();}//点击按钮验证button.onclick = function () { var text = input.value //获取输入框的值if (text === num) {alert('验证通过')} else {alert('验证失败')}}}</script>
</body></html>

效果图

图片验证码的实现方法相关推荐

  1. Python - Flask 图片验证码和邮箱验证码的后端实现

    1. 图片验证码 1.1 工具类 - utility.py 将所有和图片验证码有关的方法放在类 ImageCode import random import string from io import ...

  2. python 登陆网站图片验证,用python登录带弱图片验证码的网站

    上一篇介绍了使用python模拟登陆网站,但是登陆的网站都是直接输入账号及密码进行登陆,现在很多网站为了加强用户安全性和提高反爬虫机制都会有包括字符.图片.手机验证等等各式各样的验证码.图片验证码就是 ...

  3. 微博模拟登陆的方法 + 图灵图像图片验证码识别平台 识别验证码(97%正确率)Python + Selenium+Chrome

    最近遇到一个问题,需要频繁切换账号登陆微博,但是需要识别微博的验证码,比较麻烦.而且因为需要24h不间断的操作,所以没法使用人工打码平台,而且打码平台也比较贵,延迟又高.最后找到了一个可以机器识别出来 ...

  4. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...

    JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...

  5. 前端验证码后端返回一个图片_Web后端开发(6)——简易图片验证码的制作

    大家在登录或注册某些网站的时候经常会看到一些随机的图片验证码,那么这些验证码到底是怎么制作的呢?下面我们就从最简单的制作方法中学一下验证码的制作过程. 创建图片对象 要制作图片验证码,首先要创建一个图 ...

  6. 字符识别Python实现 图片验证码识别

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  7. c++ 图片验证码识别_基于tensorflow 实现端到端的OCR:二代身份证号识别

    最近在研究OCR识别相关的东西,最终目标是能识别身份证上的所有中文汉字+数字,不过本文先设定一个小目标,先识别定长为18的身份证号,当然本文的思路也是可以复用来识别定长的验证码识别的. 本文实现思路主 ...

  8. linux下tomcat6无法显示图片验证码 少了图形插件

    linux下tomcat6无法显示图片验证码(windows下显示正常) 原创 2015年10月20日 10:31:47 3526 linux下tomcat6无法显示图片验证码(windows下显示正 ...

  9. SpringBoot+Vue实现请求后台获取Base64编码的图片验证码并使用Redis缓存实现2分钟内有效

    场景 前端Vue的登录页面,验证码请求后台,后台生成验证码照片后使用Base64编码后, 返回给前端,前端进行显示. 注: 博客: https://blog.csdn.net/badao_liuman ...

  10. javaweb利用servlet与struts2实现可点击刷新的基础图片验证码

    javaweb利用servlet实现图片验证码 验证码是登录验证的技术,可以一定程度防止恶意脚本刷网站,造成服务器压力. 具体实现思想很简单: 首先利用servlet产生一个随机的验证码, 保存在se ...

最新文章

  1. SoftGrid教程-注意事项、错误代码
  2. Create, Save, and Open Trace Documents
  3. JQuery 自动触发 a 标签的 click事件
  4. GitHub 发布重磅更新:你电脑上的 IDE 可以删了?!
  5. 微信小程序开发简易教程一
  6. 南漂DBA——除了996,还可以收获这些...
  7. 代码中log一直报错
  8. 快速排序多种方法代码Python
  9. SQLite数据库损坏修复
  10. 虹膜识别应用多样化 6亿美元市场待挖掘
  11. android studio | openGL es 3.0增强现实(AR)开发 (1) 建立一个openGL es 3.0开发环境
  12. 入手新吉他了--雅马哈F600
  13. 网易首支AI歌曲《醒来》发布:声音太逼真 能瞒过人类
  14. ME21N/ME22N/ME23N屏幕增强BADI ME_GUI_PO_CUST
  15. 《代码的未来》读书笔记
  16. 网页表格线框html,网页表格中单元格线条及边框的设置
  17. android 绘制坐标系(雷达探测界面)
  18. NYOJ 925 国王的烦恼
  19. ssh突然无法登录Connection closed by xxx port 22
  20. vue功能之“微信支付“

热门文章

  1. 百度离线语音合成SDK使用
  2. 新站多久开始发外链?新站什么时候开始发外链
  3. 十种QQ在线客服代码
  4. c++采集声卡输出_使用Core Audio实现对声卡输出的捕捉
  5. java 象棋人机开源码,中国象棋人机博弈程序(扁平化棋局) C语言实现
  6. yy直播插入php网页,网页YY迷你版怎么用 网页YY直播间进入方法步骤
  7. 518抽奖软件教程之:公司、单位年会抽奖
  8. 幸运九宫格抽奖系统带后台源码
  9. ftl有三种映射地址_FTL地址映射的方法及装置与流程
  10. 安装oracle数据库过程中系统表空间,Oracle数据库安装及配置