canvas-验证码

纯属对Canvas API的练习

效果图:

目标:

1.画布中随机出现4个字母或数字的验证码

2.验证吗,内容随机,颜色随机,位置在当前块内随机;

3.添加4条干扰线,颜色长度随机

4.添加50个干扰颗粒,颜色随机,半径为1;

 

思路:

1.由于使用随机数据多,所以封装随机数函数 rn(min,max)

function rn(min,max){
    return Math.floor(Math.random()*(max-min)+min);
  }
//返回大于等于min ,小于max的数字

2.由于随机颜色使用多,封装随机颜色函数 rc(min,max)

function rc(min,max){
  var r=rn(min,max);
  var g=rn(min,max);
  var b=rn(min,max);
  return `rgb(${r},${g},${b})`;
}

3.创建字符串,包含验证码的数据,随机下标抽取四次,并绘制在画布上

//验证吗数据
var
pool='ABCDEFGHEIJDKMNP123456789';
//绘制4次
for(var i=0;i<4;i++){ var txt=pool[rn(0,pool.length)]; ctx.font="10px Arial"; ctx.save();
//获取文本宽度
var tw=ctx.measureText(txt).width;
//以中心旋转,旋转角度(0-90)随机 ctx.translate(
30*i+15,10); ctx.rotate(rn(0,90)*Math.PI/180); ctx.fillStyle=rc(80,140); ctx.textBaseline="top";
//绘制文本 ctx.fillText(txt,rn(
-10,10-tw),rn(-10,10-10)) ctx.restore(); }

4.6条干扰线

  for(var i=0;i<6;i++){
    ctx.beginPath();
    ctx.strokeStyle=rc(60,120);
    ctx.moveTo(rn(0,w),rn(0,h));
    ctx.lineTo(rn(0,w),rn(0,h));
    ctx.stroke();
  }

5. 50个干扰点

  for(var i=0;i<50;i++){
    ctx.beginPath();
    ctx.arc(rn(0,w),rn(0,h),1,0,2*Math.PI);
    ctx.fillStyle=rc(0,255);
    ctx.fill();
  }

 

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    body{text-align: center}
  </style>
</head>
<body>
<h3>Canvas绘制画布</h3>
<canvas id="c1"></canvas>
<script>
  var w=120;
  var h=30;
  c1.width=w;
  c1.height=h;
  var ctx=c1.getContext("2d");
  ctx.fillStyle=rc(200,250);
  ctx.fillRect(0,0,w,h);
//  绘制随机文本
  var pool='ABCDEFGHEIJDKMNP123456789';
  for(var i=0;i<4;i++){
    var txt=pool[rn(0,pool.length)];
    ctx.font="10px Arial";
    ctx.save();
    var tw=ctx.measureText(txt).width;
    ctx.translate(30*i+15,10);
    ctx.rotate(rn(0,90)*Math.PI/180);
    ctx.fillStyle=rc(80,140);
    ctx.textBaseline="top";
    ctx.fillText(txt,rn(-10,10-tw),rn(-10,10-10))
    ctx.restore();
  }
//  绘制随机6条干扰线
  for(var i=0;i<6;i++){
    ctx.beginPath();
    ctx.strokeStyle=rc(60,120);
    ctx.moveTo(rn(0,w),rn(0,h));
    ctx.lineTo(rn(0,w),rn(0,h));
    ctx.stroke();
  }
//  50个干扰点,半径为1的圆
  for(var i=0;i<50;i++){
    ctx.beginPath();
    ctx.arc(rn(0,w),rn(0,h),1,0,2*Math.PI);
    ctx.fillStyle=rc(0,255);
    ctx.fill();
  }
//  随机颜色
function rc(min,max){
  var r=rn(min,max);
  var g=rn(min,max);
  var b=rn(min,max);
  return `rgb(${r},${g},${b})`;

}
//  随机数字
  function rn(min,max){
    return Math.floor(Math.random()*(max-min)+min);
  }

</script>
</body>
</html>

 

posted @ 2018-02-01 21:17  追忆枉然  阅读(108)  评论(0编辑  收藏  举报