canvas 绘制验证码

之前用canvas绘制了八卦图, 今天用canvas绘制的验证码, 很多地方都会用到, 记录下来 ,以后可以直接用

用到的方法

矩形

  canvas.getContext('2d');    //构建绘图环境

  canvas.clearRect(x,y,w,h);    //清空之前绘制的矩形,释放空间

  canvas.fillStyle='颜色';      //填充颜色

  canvas.fillStyle='rgb(r,g,b)';    //填充颜色

  canvas.fillRect(x,y,w,h);      //绘制矩形

文字

  canvas.font='12px  微软雅黑';    //字体大小,字体

  canvas.fillText('文字',x,y);      //在画布上写字(文字内容,x坐标,y坐标);

线条,路径(干扰线)

  canvas.beginPath();        //绘制线条,路径开始,子路经的集合

  canvas.moveTo(x,y);        //起始点

  canvas.lineTo(x,y);         //终止点

  canvas.strokeStyle='颜色';      //路径的颜色

  canvas.stroke();           //链接起始点和终止点

点,圆圈(干扰点)

  canvas.arc(x,y,z,0,2*Math.PI);      //完整圆(x,y,半径,起始角,结束角);起始角和结束角决定了该圆是否完整,取值范围[0,2]

其他

  Math.random();            //[0,1)之间的随机数

  Math.floor();              //向下取整

开始画验证码

1.定义一个画布,宽高不能写在style内

<canvas id="canvas" width="120" height="30" style="cursor: pointer;"></canvas>

2.获取并画布并构建绘图环境

var cas=document.querySelector('#canvas');
var ctx=cas.getContext('2d');     //构建绘图环境

3.绘制一个矩形,要求该矩形的背景色为随机(每次刷新页面的背景色都不一样);

3.1首先生成一个随机背景的方法,颜色参数(0,255);

    function ranbColor(min,max){
        var r=Math.floor(Math.random()*(max-min+1)+min);
        var g=Math.floor(Math.random()*(max-min+1)+min);
        var b=Math.floor(Math.random()*(max-min+1)+min);
        return 'rgb('+r+','+g+','+b+')';
    }

3.2绘制矩形

    function draw(){
        ctx.fillStyle=ranbColor(170,250);   //这里背景色的取值范围为[170,250],颜色比较适中
        ctx.fillRect(0,0,120,30);    //绘制矩形
    }

4.四位随机数

4.1生成一个有范围的随机数

    function ranbNum(min,max){
        var num=Math.floor(Math.random()*(max-min+1)+min);
        return num;
    }

4.2生成一个四位数的随机数

        var data='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
        for(var i=0;i<120;i+=30){  //循环四次,取四个字
            var c=data[ranbNum(0,data.length-1)]; //index为随机数,[0,data.length-1]  取字(随机)
            ctx.fillStyle=ranbColor(60,160);    //字体颜色
            ctx.font=ranbNum(15,40)+'px SimHei';  //字体大小,字体
            ctx.fillText(c,i+ranbNum(5,12),ranbNum(15,30));   //字体填充(字内容,x轴,y轴)位置都是随机
        }
        

5.干扰线

        for (var i=0;i<10;i++) {
            ctx.beginPath(); //路径开始,子路经的集合
            ctx.moveTo(ranbNum(0,120),ranbNum(0,120));//起始点(x,y),都随机
            ctx.lineTo(ranbNum(0,120),ranbNum(0,120));//终止点(x,y)
            ctx.strokeStyle=ranbColor(60,160);//路径的颜色
            ctx.stroke();  //将上面的两个点连接起来
        }
        

6.干扰点,干扰圆圈

 //绘制干扰点
for (var i=0;i<10;i++) {
  ctx.beginPath(); //路径开始
  ctx.arc(ranbNum(0,120),ranbNum(0,30),ranbNum(1,5),0,2*Math.PI);//画圆(x,y,z,0,2*Math.PI) x坐标,y坐标,半径,完整圆
  ctx.strokeStyle=ranbColor(60,160);
  ctx.stroke();
}

完整代码, 通过点击事件来刷新文字内容和背景颜色

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <!--兼容ie9+-->
        <canvas id="canvas" width="120" height="30" style="cursor: pointer;"></canvas>
    </body>
</html>
<script>
    var cas=document.querySelector('#canvas');
    var ctx=cas.getContext('2d');
    draw();
    cas.onclick=function(){
        ctx.clearRect(0,0,120,30);   //清空之前的矩形,释放空间
        draw();
        //随机4位数
        var data='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
        for(var i=0;i<120;i+=30){
            var c=data[ranbNum(0,data.length-1)]; //index为随机数,[0,data.length-1]  取字
            ctx.fillStyle=ranbColor(60,160);    //字体颜色
            ctx.font=ranbNum(15,40)+'px SimHei';  //字体大小,字体
            ctx.fillText(c,i+ranbNum(5,12),ranbNum(15,30));   //字体填充(字内容,x轴,y轴)
        }
        
        //绘制干扰线
        for (var i=0;i<10;i++) {
            ctx.beginPath(); //路径开始,子路经的集合
            ctx.moveTo(ranbNum(0,120),ranbNum(0,120));//起始点(x,y),都随机
            ctx.lineTo(ranbNum(0,120),ranbNum(0,120));//终止点(x,y)
            ctx.strokeStyle=ranbColor(60,160);//路径的颜色
            ctx.stroke();  //将上面的两个点连接起来
        }
        
        
        //绘制干扰点
        for (var i=0;i<10;i++) {
            ctx.beginPath(); //路径开始
            ctx.arc(ranbNum(0,120),ranbNum(0,30),ranbNum(1,5),0,2*Math.PI);//画圆(x,y,z,0,2*Math.PI) x坐标,y坐标,半径,完整圆
            ctx.strokeStyle=ranbColor(60,160);
            ctx.stroke();
        }
    }
    
    //随机数方法
    function ranbNum(min,max){
        var num=Math.floor(Math.random()*(max-min+1)+min);
        return num;
    }
    //绘制矩形
    function draw(){
        ctx.fillStyle=ranbColor(170,250);   //这里背景色的取值范围为[170,250],颜色比较适中
        ctx.fillRect(0,0,120,30);    //绘制矩形
    }
    
    //颜色界于170到250,随机
    function ranbColor(min,max){
        var r=Math.floor(Math.random()*(max-min+1)+min);//170+[0,80)
        var g=Math.floor(Math.random()*(max-min+1)+min);//170+[0,80)
        var b=Math.floor(Math.random()*(max-min+1)+min);//170+[0,80)
        return 'rgb('+r+','+g+','+b+')';
    }
</script>

效果(这里只有图片,没有点击的动态效果,需要自己在本地运行看效果)

原文地址:https://www.cnblogs.com/xiaoxinzi/p/8569334.html