上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的。我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图。下面介绍具体步骤。

首先随便找一张图片渲染到canvas上,这里#canvas作为画布,#block作为裁剪出来的小滑块。

var canvas = document.getElementById('canvas')

var block = document.getElementById('block')

var canvas_ctx = canvas.getContext('2d')

var block_ctx = block.getContext('2d')

var img = document.createElement('img')

img.onload = function() {

canvas_ctx.drawImage(img, 0, 0, 310, 155)

block_ctx.drawImage(img, 0, 0, 310, 155)

};

img.src = 'img.jpg'

下面考虑如何裁剪出拼图的形状,拼图形状比较复杂,首先我们画一个正方形,接着上边的代码写:

var x = 150, y = 40, w = 42, r = 10, PI = Math.PI

function draw(ctx) {

ctx.beginPath()

ctx.moveTo(x, y)

ctx.lineTo(x + w, y)

ctx.lineTo(x + w, y + w)

ctx.lineTo(x, y + w)

ctx.clip()

}

draw(canvas_ctx)

draw(block_ctx)

x,y为正方形左上角的坐标,现在先随便写后边生成的时候用随机数,w为正方形的边长,r为后边画缺口的圆的半径。我们先把绘图过程用函数封装起来,方便后面同时操作背景和滑块。用clip()方法裁剪图片后生成一个正方形。

接下来画正方形上边和右边的圆形:

function draw(ctx) {

ctx.beginPath()

ctx.moveTo(x,y)

+ ctx.lineTo(x+w/2,y)

+ ctx.arc(x+w/2,y-r+2, r,0,2*PI) //

+ ctx.lineTo(x+w/2,y)

ctx.lineTo(x+w,y)

+ ctx.lineTo(x+w,y+w/2)

+ ctx.arc(x+w+r-2,y+w/2,r,0,2*PI) //

+ ctx.lineTo(x+w,y+w/2)

ctx.lineTo(x+w,y+w)

ctx.lineTo(x,y+w)

ctx.lineTo(x,y)

ctx.clip()

}

两处注释的位置将圆心往内偏移了2px,实现缺口的样式。然后是左边空心的部分,由于clip是裁剪路径内的部分,因此直接像上面画圆是不行的,我们开启一条新的路径,然后画圆将这个正方形“遮盖”出一个缺口,这里会用到 globalCompositeOperation 属性,'xor'顾名思义。代码接上边:

function draw(ctx) {

ctx.beginPath()

...

ctx.lineTo(x,y)

ctx.clip()

+ ctx.beginPath()

+ ctx.arc(x,y+w/2, r,1.5*PI,0.5*PI) // 只需要画正方形内的半圆就行,方便背景图片的裁剪

+ ctx.globalCompositeOperation = "xor"

+ ctx.fill()

}

现在一个基本的拼图形状有了,我们调整#block的大小,并将裁剪出来的滑块放入#block中:

img.onload = function() {

ctx.drawImage(img, 0, 0, 310, 155)

block_ctx.drawImage(img, 0, 0, 310, 155)

+ var blockWidth = w + r * 2

+ var _y = y - r * 2 + 2 // 滑块实际的y坐标

+ var ImageData = block_ctx.getImageData(x, _y, blockWidth, blockWidth)

+ block.width = blockWidth

+ block_ctx.putImageData(ImageData, 0, _y)

}

现在我们需要把左边画布展示原来的图片,并且抠掉中间滑块的部分,这里画路径的过程都是一样的,唯一不同只是clip()那里改成fill()即可实现效果,我们前面已经把画路径的过程封装成函数了,稍作改动即可:

- function draw(ctx) {

+ function draw(ctx, operation) {

...

- ctx.clip()

+ ctx.fillStyle = '#fff'

+ ctx[operation]()

...

}

+ draw(canvas_ctx, 'fill')

+ draw(block_ctx, 'clip')

接下来就是写样式了,略过:

然后就是写拖动事件,我们可以在鼠标按下时记录鼠标位置,然后在拖动时给滑块设置left值。最后在松开鼠标时,判断滑块此时的left值和最开始裁剪滑块时的x值,如果在一定范围内就算验证通过,否则验证失败。

最后再加上随机图片和随机剪切位置,基本就ok了。另外可以判断下鼠标移动时y轴的变化,以判断是否是“人”在操作,当然web安全这块神魔乱舞的,我就不班门弄斧了,只是做个简单判断就行。

由于没有给切片边缘加上边框或者阴影,导致某些图片的滑块可识别度不高,需要后边完善下(其实是我还没折腾出来- -),希望懂这块的大神帮我完善下//

后边代码比较杂乱,就不贴上来了, 查看完整代码点这里 演示地址 点这里

总结

以上所述是小编给大家介绍的js+canvas实现滑动拼图验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

滑动拼图验证码 免费 java_js+canvas实现滑动拼图验证码功能相关推荐

  1. java 滑块验证码 开源,Java AWT生成滑动验证码

    最近工作需要在登录时使用滑动验证码做登录校验,在生成验证码图片的时候碰到了不小的麻烦 : (. 网上能查到的做法基本上都是使用一张已存在的实际图片作为滑块的图形模板,然后按照此模板做二重循环逐像素地从 ...

  2. 完美解决vue项目中弹出框滑动时,内部页面也跟着滑动问题

    完美解决vue项目中弹出框滑动时,内部页面也跟着滑动问题 参考文章: (1)完美解决vue项目中弹出框滑动时,内部页面也跟着滑动问题 (2)https://www.cnblogs.com/qhanti ...

  3. android camera滑动,Android怎么实现小米相机底部滑动指示器

    Android怎么实现小米相机底部滑动指示器 发布时间:2021-04-15 14:39:38 来源:亿速云 阅读:94 作者:小新 这篇文章给大家分享的是有关Android怎么实现小米相机底部滑动指 ...

  4. 抖音只能上下滑动吗_抖音只能上下滑动吗_实现仿抖音视频滑动的两个方案

    0.效果图 1.先来看一下需求 1. 项目中的视频播放,要求实现抖音那种竖直方向一次滑动一页的效果.滑动要流畅不卡顿,并且手动触摸滑动超过1/2的时候松开可以滑动下一页,没有超过1/2返回原页. 2. ...

  5. ViewPager循环滑动和靠按钮来控制循环滑动

    ViewPager用按钮来控制,昨天说了一种方式是直接设置setcurrentItem(),但是今天发现如果我们要设置viewpager循环滑动的话这种方式似乎不可行,于是看源码发现了Viewpage ...

  6. 签字板 JAVA_JS canvas实现画板和签字板功能

    本文实例为大家分享了JS canvas实现画板/签字板功能的具体代码,供大家参考,具体内容如下 前言 常见的电子教室里的电子黑板. 本文特点: 原生JS 封装好的模块 最简代码样例 Document ...

  7. 【验证码的识别】—— 点触式验证码的识别

    一.前言 大家好,不知不觉的我来csdn已经又一周年了,在这一年里,我收获了很多东西,我是2022年2月22日入驻CSDN的,一开始只是为了方便浏览文章的,后来,我也有事没事发发文章,创作了100多篇 ...

  8. 保存验证码的方法_selenium自动化测试:6.验证码处理

    0.前言 如果可以的话,请先关注(专栏和账号),然后点赞和收藏,最后学习和进步.你的支持是我继续写下去的最大动力,个人定当倾囊而送,不负众望.谢谢!!! 1.前提 基于win10专业版64位系统+64 ...

  9. html5制作拼图游戏教程,用HTML5制作视频拼图的教程

    几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画.他让我看下做个DEMO,于是就自己整了一会,也确实不难.用canvas很容易做.所以这篇博文不适合高手看....就是随便写来玩玩的 ...

最新文章

  1. Transformer在CV领域有可能替代CNN吗?还有哪些应用前景?
  2. 3年5000家,苏宁小店如何立足“中国第一O2O社区小店”?
  3. 嵌入式开发输出调试信息的几种方法(常规法及非常规法)
  4. UA SIE545 优化理论基础3 Fritz-John与Kuhn-Tucker理论总结 带等式约束与不等式约束的极值问题
  5. 手动建立Mysql表实体类技巧
  6. Mybatis批量更新数据
  7. BFS HDOJ 2102 A计划
  8. [渝粤教育] 西南科技大学 理论力学 在线考试复习资料
  9. Linux就该这么学-第三课
  10. mysql 查询结果导出文件并导入文件到数据库
  11. linux上传文件夹工具,[转] psftp(linux简易上传上载工具)的用法及常用命令
  12. laravel使用dompdf总结
  13. 用esp8266开发板制作WiFi Killer
  14. python 使用百度搜索推广API,获取账户基本信息
  15. codewars练习(javascript)-2021/3/14
  16. No3 jQuery
  17. python输出数字怎么办_python怎么输出数字
  18. 独家揭秘:小程序销售额破千万,他们怎么做到的
  19. Ubuntu开机启动黑屏,只有鼠标
  20. Python 最简单的微信刷屏

热门文章

  1. Flash Builder 入门
  2. 趣味三角——第11章——一个著名的公式
  3. orange 数据分析_使用Orange GUI的放置结果数据分析
  4. html——网页上添加表格
  5. hdoop面试题6 后面的面试题各公司面试题,算法数据结构相关面试题 后面没看 阿善有用...
  6. python与js通用的数据结构_常见数据结构和Javascript实现总结
  7. win10下载python失败_win10环境下python下载安装,及一些错误的解决方案
  8. 微网-并网逆变器-下垂控制-Droop Conrol
  9. 解决Altium Designer许可(license)授权紧张的问题
  10. 三台机器安装zookeeper集群