• 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>
  • 相关阅读:
    Angular4 后台管理系统搭建(5)
    Angular4 后台管理系统搭建(4)
    Angular4 后台管理系统搭建(3)
    Angular4 后台管理系统搭建(2)
    Angular4 后台管理系统搭建(1)
    训练x_vector时kaldi的模型选择机制
    investment
    拉单杠
    programming blogs
    pronunciation from longman 718
  • 原文地址:https://www.cnblogs.com/liangfc/p/8401325.html
Copyright © 2020-2023  润新知