canvas生成验证码

247 阅读2分钟

首先先生成 canvas 基本结构:

< ! DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <canvas id="canvas" width="120" height="40"></canvas>
  </body>
</html>

这里就生成了一个 id 为 canvas 的画布,然后我们来解决 js

首先,我们要有随机生成数字和颜色的方法

//随机数的生成函数
function rn(min, max) {
  return parseInt(Math.random() * (max - min) + min);
}
//随机生成颜色的函数
function rc(min, max) {
  var r = rn(min, max);
  var g = rn(min, max);
  var b = rn(min, max);
  return 'rgb(${r},${g},$(b))';
}

然后 我们来初始化画布:

// 设置宽高
var w = 120;
var h = 40;
// 获取画布对象
var canvas = document.querySelector('#canvas');
// 获取2d画笔
var ctx = canvas.getContext('2d');

初始化完,我们就可以开始画了

// 首先,填充一下随机颜色  这里用180-230这个浅色范围
ctx.fillstyle = rc(180, 230);
// 填充矩形
ctx.fillRect(0, 0, w, h);

到这里,我们就实现了一个有颜色的画布区域,然后开始绘制随机字符串

//随机字符串
var pool = 'ABCDEFGHIGKLIMNOPQRSTUVwXYZ1234567890';
for (var i = 0; i < 4; i++) {
  //取出随机的字母或数字 ,到时候定义一个string+=,返回回去就行
  var c = pool[rn(0, pool.length)];
  //随机出字体大小
  var fs = rn(18, 40);
  //随机字母数字的旋转角度
  var deg = rn(-30, 30);
  ctx.font = fs + 'px Simhei ';
  //设置或返回在绘制文本时使用的当前文本基线。
  ctx.textBaseline = 'top ';
  //设置字体的填充颜色
  ctx.fillStyle = rc(80, 150);
  // 保存当前画笔样式
  ctx.save();
  // 设置当前i的字符的位置
  ctx.translate(30 * i + 15, 15);
  // 随机略微旋转
  ctx.rotate((deg * Math.PI) / 180);
  // 填充,后面两个参数可以自行调整位置
  ctx.fillText(c, 0, 0);
  // 恢复到保存之前状态,不然旋转会出问题
  ctx.restore();
}

到这里,我们已经可以实现了基本的验证码的样式

接下来,我们就随机生成一些干扰的线,我们在画布范围内随机生成 5 条线段

//随机生成5条干扰线
for(var i=;i<5;i++){
  ctx.beginPath()
  ctx.moveTo(rn(0,w) ,rn(0,h));
  ctx.lineTo( rn(0,w) ,rn(0,h));
  ctx.strokeStyle = rc( 180,230);
  ctx.closePath();
  ctx.stroke()
}

然后,我们得到了这样的效果:

那我们现在还不够,还想要做一些小圆点进行干扰,那就继续加:

//随机产生40个小的干扰圆点
for (var i = o; i < 40; i++) {
  ctx.beginPath();
  // x y 半径 0-2pi的圆
  ctx.arc(rn(0, w), rn(0, h), 1, 0, 2 * Math.PI);
  ctx.closePath();
  ctx.fillStyle = rc(150, 200);
  ctx.fill();
}

这样,我们就已经能生成随机小圆点了

然后把他自定义封装成一个函数,就大功告成!