效果图:

思路:

1, 绘制canvas画布,进行基础设置

2.绘制一个矩形

3.设置验证码的随机数

4.设置验证码随机数的随机颜色

5.绘制随机干扰线

6,绘制随机干扰点

经过以上六个步骤,验证码的雏形就做好了

7.旋转验证码中的随机数(这部分在章节内详细说明)

8.重新获取验证码

缕清思路,然后一步步操作

1.进行canvas的基础操作

(1)在html中定义画布

  <canvas id="canvas"></canvas>

(2)js定义

  window.onload = function(){
  var canvas = document.getElementById("canvas"); //获取到canvas对象
   var context = canvas.getContext("2d"); //获取到canvas绘图环境
//设置画布大小
canvas.width = 120;
canvas.height = 40;
};

2.绘制矩形

context.strokeRect(0,0,120,40);

3.设置验证码的随机数

(1)定义一个数组存放验证码的随机数,我设置了数字和小写字母

 var aCode = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

(2)设置验证码的随机数

for(var i = 0; i < 4; i ++){
var x = 20 + i * 20;
var y = 10 + Math.random() * 10;
var index = Math.floor(Math.random()*aCode.length); //获取到一个随机的索引值
var txt = aCode[index]; //获取到数组里面的随机的内容
context.font = "bold 20px 微软雅黑"; //设置文字样式
context.fillText(txt,x,y);
}

4.设置验证码随机数的随机颜色

(1)通过以上步骤可以看到已经出现了随机数,接下来需要设置随机数的随机颜色

    function getColor(){
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
if(r == 255 && g == 255 && b == 255){
r = 0;
g = 0;
b = 0;
}
return "rgb("+r+","+g+","+b+")";
}

(2)然后再将随机颜色加进去

 context.fillStyle = getColor();

5.设置随机干扰线

//绘制干扰线
for(var i = 0; i < 8; i ++ ){
context.strokeStyle = getColor();
context.beginPath();
context.moveTo(Math.random()*120,Math.random()*40);
context.lineTo(Math.random()*120,Math.random()*40);
context.stroke();
}

6,绘制随机干扰点

干扰点和干扰线的原理是一样的,干扰点可以看成很小的干扰线

//绘制干扰点
for(var i = 0;i <20 ;i ++){
var x = Math.random() *120;
var y = Math.random() *40;
context.strokeStyle = getColor();
context.beginPath();
context.moveTo( x,y);
context.lineTo(x+1,y+1);
context.stroke();
}

7.旋转验证码中的随机数

因为canvas是一个画布,所以canvas中的内容只是“画”中的一部分,不能单独旋转,这里旋转的原理是每当绘制一个数字的之前将画布移动到相应数字的x,y的点,然后以点进行旋转,旋转好以后,绘制随机数,最后将画布还原到原来的位置进行下一个随机数的绘制

 //产生随机数
for(var i = 0; i < 4; i ++){
var deg = Math.random() * 180 * Math.PI / 180;
var x = 20 + i * 20;
var y = 10 + Math.random() * 10;
var index = Math.floor(Math.random()*aCode.length); //获取到一个随机的索引值
var txt = aCode[index]; //获取到数组里面的随机的内容
context.font = "bold 20px 微软雅黑"; //设置文字样式
context.fillStyle = getColor();
context.translate(x,y);
context.rotate(deg);
context.fillText(txt,0,0);
context.rotate(-deg);
context.translate(-x,-y); }

8.重新获取验证码

重新获取验证码需要在body中添加一个点击事件

 <a onclick="refresh()">重新获取</a>

然后将绘制随机数的代码封装成一个方法,我这里方法为draw(),canvas的刷新需要重新定义画布

    function refresh(){
var canvas = document.getElementById("canvas"); //获取到canvas对象
var context = canvas.getContext("2d"); //获取到canvas绘图环境
draw(canvas,context);
}

注:腾讯课堂视频小结

canvas绘制随机验证码的更多相关文章

  1. canvas实现随机验证码

    canvas实现随机验证码 知识点 canvas生成背景图和文字 设置字体样式和大小 String的fromCharCode(code码)生成大小写字母和数字 str.toLowerCase()转小写 ...

  2. 微信小程序 canvas 生成随机验证码

    转载:https://blog.csdn.net/qq_16646819/article/details/81020245?utm_source=blogxgwz0 js // pages/bind/ ...

  3. canvas制作随机验证码

    看到人家彩色背景的验证码想测试一下: 创建html代码: <canvas id="myCanvas" width="200" height="1 ...

  4. 用Canvas生成随机验证码(后端前端都可以)

    一 .使用前端生成验证码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  5. canvas绘制随机颜色的柱形图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【重点突破】——Canvas技术绘制随机改变的验证码

    一.引言 本文主要是我在学习Canvas技术绘图时的一个小练习,绘制随机改变的验证码图片,虽然真正的项目里不这么做,但这个练习是一个掌握Canvas技术很好的综合练习.(真正的项目中验证码图片使用服务 ...

  7. 用canvas绘制验证码

    在通常的登录界面我们都可以看到验证码,验证码的作用是检测是不是人在操作,防止机器等非人操作,防止数据库被轻而易举的攻破. 验证码一般用PHP和java等后端语言编写: 但是在前端,用canva或者SV ...

  8. canvas绘制圆心扇形可组成颜色随机的七色小花

    啊~现在应该还是春天吧.心情一如既往的烦闷呐.最近做了一个canvas的扇形绘制的东西.把它整理出来变成一个适合春天的花朵绘制~沉闷的工作环境已经让我这种有趣的人也变成了无聊鬼怪呢.下次一定想找一个年 ...

  9. Android实现随机验证码——自定义View

    一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个 ...

随机推荐

  1. Fortran与C/C++混合编程示例

    以下例子均来自网络,只是稍作了编辑,方便今后查阅. 子目录 (一) Fortran调用C语言 (二) C语言调用Fortran (三) C++ 调用Fortran (四) Fortran 调用 C++ ...

  2. 一个简单的windows勒索软件分析

    根据分析,此病毒是一个勒索软件,通过修改登录用户密码,留下勒索QQ号码向用户索要金钱. 它调用了Kernel32.dll里的WinExec来执行更改用户密码的cmd命令,密码为107289,更改完密码 ...

  3. 假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小

    假如有Thread1.Thread2.Thread3.Thread4四条线程分别统计C.D.E.F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现? 实现1:用concur ...

  4. 在form表单里上传图片

    需要上传多个图片分别上传,本来提供的工具类里上传一张可以form表单对象实现 后台用MultipartFile file var formdata = new FormData($("#in ...

  5. [数]青蛙的约会&Strange function

    拓展欧几里得:求导&二分 POJ-1061 拓展欧几里得的应用,需要开long long 第一次做这个题的时候进行了毫无用处的找公式(?),是个现在的我看不懂的迷之思路. 第二发的时候还是不明 ...

  6. C#中d的??和?

    在C#中??和?分别是什么意思?   1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=nu ...

  7. Redis安装部署教程

    1)下载 redis-3.2.9.tar.gz 2)用ssh工具连接目录主机,在命令窗口输入:mkdir -p /opt/redis创建redis文件夹 3)通过WinSCP工具将redis-3.2. ...

  8. Java的数组,集合,数据结构,算法(一)

    本人的愚见,博客是自己积累对外的输出,在学习初期或自己没有多少底料的情况下,与其总结写博客不如默默去搞自己的代码,但是学到集合这一块时,数组,集合,数据结构,算法这个概念搞的我比较混淆,所以不得已写这 ...

  9. grid-layout

    <!-- 创建三个网格布局--> .wrapper { <!--创建一个网格布局 --> display: grid; <!--创建3列 且每列都等距 --> gr ...

  10. Scientific Toolworks Understand 软件教程

    系统:Ubuntu16.04 x64 安装 安装包 下载地址: part1:http://download.csdn.net/detail/p942005405/9711128 part2:http: ...