zoukankan      html  css  js  c++  java
  • 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>

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

  • 相关阅读:
    [POJ 1050]To the Max
    P1678 烦恼的高考志愿
    P1873 砍树
    P1102 A-B 数对
    P6771 [USACO05MAR]Space Elevator 太空电梯
    P2347 砝码称重
    P1832 A+B Problem(再升级)
    P1679 神奇的四次方数
    P1877 [HAOI2012]音量调节
    P1049 装箱问题
  • 原文地址:https://www.cnblogs.com/xiaoxinzi/p/8569334.html
Copyright © 2011-2022 走看看