返回顶部
首页 > 资讯 > 前端开发 > html >Canvas入门实战之怎么实现一个图形验证码
  • 615
分享到

Canvas入门实战之怎么实现一个图形验证码

2024-04-02 19:04:59 615人浏览 泡泡鱼
摘要

这篇文章主要介绍“canvas入门实战之怎么实现一个图形验证码”,在日常操作中,相信很多人在Canvas入门实战之怎么实现一个图形验证码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大

这篇文章主要介绍“canvas入门实战之怎么实现一个图形验证码”,在日常操作中,相信很多人在Canvas入门实战之怎么实现一个图形验证码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Canvas入门实战之怎么实现一个图形验证码”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 

你将收获

设计思路

  1. 用canvas生成画布

  2. 用canvas画干扰线或躁点

  3. 生成随机不重复的n的字母

  4. 用canvas绘制文字

  5. 初始化和canvas点击事件

  6. 组件化封装

文末将附上组件封装的源码,欢迎大家随时沟通交流。关于项目的打包,我将使用自己基于gulp4搭建的9012教你如何使用gulp4开发项目脚手架。

效果预览

Canvas入门实战之怎么实现一个图形验证码

实现思路

我将按照上文中的设计思路的步骤一步步实现,首先我们先定义一个es5类:

functioGCode(el, option) {     this.el = typeof el === 'string' ? document.querySelector(el) : el;     this.option = option;     this.init(); }

其中init是用来初始化用的,参数el代表需要挂载的元素或元素id,option为传入的可选项,稍后会在代码中体现,通常这也是面向对象的常用套路。

1.绘制画布

Gcode.prototype = {     constructor: Gcode,     init: function() {         if(this.el.getContext) {             isSupportCanvas = true;             var ctx = this.el.getContext('2d'),             // 设置画布宽高             cw = this.el.width = this.option.width || 200,             ch = this.el.height = this.option.height || 40;         }     } }

这里我们在初始化方法中先定义一个canvas画布,宽高为用户自定义的宽高,默认为200*40。

2.绘制干扰线

// 画干扰线 drawLine: function(ctx, lineNum, maxW, maxH) {     ctx.clearRect(0, 0, maxW, maxH);     for(var i=0; i < lineNum; i++) {         var dx1 = Math.random()* maxW,             dy1 = Math.random()* maxH,             dx2 = Math.random()* maxW,             dy2 = Math.random()* maxH;         ctx.strokeStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';         ctx.beginPath();         ctx.moveTo(dx1, dy1);         ctx.lineTo(dx2, dy2);         ctx.stroke();     } }

这里我们对类Gcode定义原型方法drawLine,然后通过for循环绘制随机位置的线条,为了让canvas每次点击能清空之前的干扰线,我们使用clearRect来清除画布。

3.生成随机不重复的n个字符

我们通过递归实现,如下==:

// 生成唯一文字 generateUniqueText: function(source, hasList, limit) {     var text = source[Math.floor(Math.random()*limit)];     if(hasList.indexOf(text) > -1) {         return this.generateUniqueText(source, hasList, limit)     }else {         return text     }   } // 生成指定个数的随机文字 randomText: function(len) {     var source = ['a', 'b', 'c', 'd', 'e',     'f', 'g', 'h', 'i', 'j',      'k', 'l', 'm', 'o', 'p',     'q', 'r', 's', 't', 'u',     'v', 'w', 'x', 'y', 'z'];     var result = [];     var sourceLen = source.length;     for(var i=0; i< len; i++) {         var text = this.generateUniqueText(source, result, sourceLen);         result.push(text)     }     return result.join('') }

我们通过定义一个字母表,传入生成的随机字母的个数,配合generateUniqueText来实现生成唯一不重复的n个随机字符。当然笔者认为这个方法并不优雅,你也可以使用uuid的方式或者更好的方式,欢迎随时和笔者交流。

4.用canvas绘制文字

// 画文字 drawText: function(ctx, text, maxH) {     var len = text.length;     for(var i=0; i < len; i++) {         var dx = 30 * Math.random() + 30* i,             dy = Math.random()* 5 + maxH/2;         ctx.fillStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';         ctx.font = '30px Helvetica';         ctx.textBaseline = 'middle';         ctx.fillText(text[i], dx, dy);     } },

这里和上文画线实现类似。就不做过多介绍了。

5.初始化和canvas点击事件

接下来我们看看完整的初始化代码:

init: function() {     if(this.el.getContext) {         isSupportCanvas = true;         var ctx = this.el.getContext('2d'),         // 设置画布宽高         cw = this.el.width = this.option.width || 200,         ch = this.el.height = this.option.height || 40,         textLen = this.option.textLen || 4,         lineNum = this.option.lineNum || 4;         var text = this.randomText(textLen);          this.onClick(ctx, textLen, lineNum, cw, ch);         this.drawLine(ctx, lineNum, cw, ch);         this.drawText(ctx, text, ch);     } }

点击事件主要是为了用户点击可以切换验证码:

onClick: function(ctx, textLen, lineNum, cw, ch) {     var _ = this;     this.el.addEventListener('click', function(){         text = _.randomText(textLen);         _.drawLine(ctx, lineNum, cw, ch);         _.drawText(ctx, text, ch);     }, false) }

到此,一个完整的验证码组件实现完成,怎么用呢?如下:

new Gcode('#canvas_code', {         lineNum: 6,  // 可选         textLen: 4,  // 可选         width: 200,  // 可选         height: 50   // 可选     })

完整代码如下,欢迎学习交流:

// canvas绘制图形验证码     (function(){         function Gcode(el, option) {             this.el = typeof el === 'string' ? document.querySelector(el) : el;             this.option = option;             this.init();         }         Gcode.prototype = {             constructor: Gcode,             init: function() {                 if(this.el.getContext) {                     isSupportCanvas = true;                     var ctx = this.el.getContext('2d'),                     // 设置画布宽高                     cw = this.el.width = this.option.width || 200,                     ch = this.el.height = this.option.height || 40,                     textLen = this.option.textLen || 4,                     lineNum = this.option.lineNum || 4;                     var text = this.randomText(textLen);                              this.onClick(ctx, textLen, lineNum, cw, ch);                     this.drawLine(ctx, lineNum, cw, ch);                     this.drawText(ctx, text, ch);                 }             },             onClick: function(ctx, textLen, lineNum, cw, ch) {                 var _ = this;                 this.el.addEventListener('click', function(){                     text = _.randomText(textLen);                     _.drawLine(ctx, lineNum, cw, ch);                     _.drawText(ctx, text, ch);                 }, false)             },             // 画干扰线             drawLine: function(ctx, lineNum, maxW, maxH) {                 ctx.clearRect(0, 0, maxW, maxH);                 for(var i=0; i < lineNum; i++) {                     var dx1 = Math.random()* maxW,                         dy1 = Math.random()* maxH,                         dx2 = Math.random()* maxW,                         dy2 = Math.random()* maxH;                     ctx.strokeStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';                     ctx.beginPath();                     ctx.moveTo(dx1, dy1);                     ctx.lineTo(dx2, dy2);                     ctx.stroke();                 }             },             // 画文字             drawText: function(ctx, text, maxH) {                 var len = text.length;                 for(var i=0; i < len; i++) {                     var dx = 30 * Math.random() + 30* i,                         dy = Math.random()* 5 + maxH/2;                     ctx.fillStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';                     ctx.font = '30px Helvetica';                     ctx.textBaseline = 'middle';                     ctx.fillText(text[i], dx, dy);                 }             },             // 生成指定个数的随机文字             randomText: function(len) {                 var source = ['a', 'b', 'c', 'd', 'e',                 'f', 'g', 'h', 'i', 'j',                  'k', 'l', 'm', 'o', 'p',                 'q', 'r', 's', 't', 'u',                 'v', 'w', 'x', 'y', 'z'];                 var result = [];                 var sourceLen = source.length;                 for(var i=0; i< len; i++) {                     var text = this.generateUniqueText(source, result, sourceLen);                     result.push(text)                 }                 return result.join('')             },             // 生成唯一文字             generateUniqueText: function(source, hasList, limit) {                 var text = source[Math.floor(Math.random()*limit)];                 if(hasList.indexOf(text) > -1) {                     return this.generateUniqueText(source, hasList, limit)                 }else {                     return text                 }               }         }         new Gcode('#canvas_code', {             lineNum: 6         })     })();

到此,关于“Canvas入门实战之怎么实现一个图形验证码”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Canvas入门实战之怎么实现一个图形验证码

本文链接: https://lsjlt.com/news/84160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Canvas入门实战之怎么实现一个图形验证码
    这篇文章主要介绍“Canvas入门实战之怎么实现一个图形验证码”,在日常操作中,相信很多人在Canvas入门实战之怎么实现一个图形验证码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • 使用canvas怎么实现一个图形验证码功能
    本篇文章给大家分享的是有关使用canvas怎么实现一个图形验证码功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。<!DOCTYPE html><h...
    99+
    2023-06-09
  • vue实现图形验证码
    本文实例为大家分享了vue实现图形验证码的具体代码,供大家参考,具体内容如下 效果图: 或 或 或 代码: 验证码组件: src/common/sIdentify.vue ...
    99+
    2024-04-02
  • PHP中怎么实现图形验证码
    这期内容当中小编将会给大家带来有关PHP中怎么实现图形验证码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体实现代码如下:<php  class rndnum{&nb...
    99+
    2023-06-17
  • Python怎么实现图形验证码识别
    这篇文章主要介绍了Python怎么实现图形验证码识别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现图形验证码识别文章都会有所收获,下面我们一起来看看吧。环境使用python 3.9pycha...
    99+
    2023-07-05
  • 使用.Net Core实现的一个图形验证码功能
    SimpleCaptcha是一个使用简单,基于.Net Standard 2.0的图形验证码模块。它的灵感来源于Edi.Wang的这篇文章https://edi.wang/post/...
    99+
    2024-04-02
  • vue项目实现图形验证码
    本文实例为大家分享了vue项目实现图形验证码的具体代码,供大家参考,具体内容如下 效果预览:(项目要求清爽一点,所以没背景。但是下面的代码会把背景干扰写进去) 1.下载identi...
    99+
    2024-04-02
  • vue实现图形验证码登录
    本文实例为大家分享了vue实现图形验证码登录的具体代码,供大家参考,具体内容如下 1、效果图 2、在components下面新建文件identify.vue,内容: <t...
    99+
    2024-04-02
  • Java实战之用Spring开发条形码和验证码
    一、条形码 代码如下: import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage;...
    99+
    2024-04-02
  • vue实现登录时图形验证码
    本文实例为大家分享了vue实现登录时图形验证码的具体代码,供大家参考,具体内容如下 效果图: 点击图案可以切换字符 1.新建 Identify.vue 组件 <templat...
    99+
    2024-04-02
  • 微信小程序实现图形验证码
    本文实例为大家分享了微信小程序实现图形验证码的具体代码,供大家参考,具体内容如下 1.wxml页面 <canvas canvas-id="canvas" bindtap='ch...
    99+
    2024-04-02
  • java web开发之servlet图形验证码功能的实现
    一 验证码的由来在web项目开发中,为了防止部分人使用自动工具(如:自动注册机)等进行批量的数据处理,在不同的功能节点部分,添加了验证码进行验证,达到对自动软件的屏蔽效果最经典的应用如:网站注册图形验证码;接下来,通过java技术,结合se...
    99+
    2023-05-30
    java web servlet
  • php中怎么实现一个验证码功能
    php中怎么实现一个验证码功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。新建一个captcha.php:php     /...
    99+
    2023-06-17
  • php怎么实现图片验证码
    本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑。php怎么实现图片验证码?PHP实现图片验证码功能验证码: captcha, 是一种用于区别人和电脑的技术原理(Completely Automated Public ...
    99+
    2017-09-20
    php
  • Canvas如何实现一个六边形能力图
    这篇文章将为大家详细讲解有关Canvas如何实现一个六边形能力图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言六边形能力图如下,由 6 个 六边形组成,每一个顶点代表其在某一方面的能力。这篇文章我...
    99+
    2023-06-09
  • vue如何实现登录时图形验证码
    这篇文章主要介绍vue如何实现登录时图形验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下效果图:点击图案可以切换字符1.新建 Identify.vue 组件<template> ...
    99+
    2023-06-29
  • 使用ajax怎么实现一个验证码功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个验证码功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先创建一个验证码:<%@ page con...
    99+
    2023-06-08
  • android实现一个图片验证码倒计时功能
    1.如图所示,要实现一个验证码的倒计时的效果                &n...
    99+
    2023-05-30
    android 验证码 倒计时
  • Java实现EasyCaptcha图形验证码的具体使用
    EasyCaptcha github地址: https://github.com/whvcse/EasyCaptcha 简介 Java图形验证码,支持gif、中文、算术等类型,...
    99+
    2024-04-02
  • HTML5 canvas怎么实现图形变换
    这篇文章主要介绍“HTML5 canvas怎么实现图形变换”,在日常操作中,相信很多人在HTML5 canvas怎么实现图形变换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作