zoukankan      html  css  js  c++  java
  • 用canvas绘制验证码

    在通常的登录界面我们都可以看到验证码,验证码的作用是检测是不是人在操作,防止机器等非人操作,防止数据库被轻而易举的攻破。

    验证码一般用PHP和java等后端语言编写;

    但是在前端,用canva或者SVG也可以绘制验证码;

    让我们先来看一个简单的但是有点丑的验证码:

    绘制验证码的关键点:选取的四个字符随机、字体的颜色、旋转角度随机、其中有五条线和50个随机的小点来干扰;

    步骤:

    画浅色背景

    画随机文字

    画5条干扰线
    画100条干扰点(半径为1的圆)

    1.新建一个函数产生随机数
    //1.新建一个函数产生随机数
    function rn(min,max){ return parseInt(Math.random()*(max-min)+min); }
    2.新建一个函数产生随机的颜色
    //2.新建一个函数产生随机颜色
    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 w=120;
    var h=40;
    var ctx=c1.getContext("2d");
    ctx.fillStyle=rc(180,230);
    ctx.fillRect(0,0,w,h);
    4.随机产生字符串
    //4.随机产生字符串
    var pool="ABCDEFGHIJKLIMNOPQRSTUVWSYZ1234567890";
    for(var i=0;i<4;i++){
        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();
        ctx.translate(30*i+15,15);
       ctx.rotate(deg*Math.PI/180);
        ctx.fillText(c,-15+5,-15);
        ctx.restore();
    }
    5.随机产生5条干扰线
    //5.随机产生5条干扰线,干扰线的颜色要浅一点
    for(var i=0;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();
    }
    6.随机产生40个干扰的小点
    //6.随机产生40个干扰的小点
    for(var i=0;i<40;i++){
        ctx.beginPath();
        ctx.arc(rn(0,w),rn(0,h),1,0,2*Math.PI);
        ctx.closePath();
        ctx.fillStyle=rc(150,200);
        ctx.fill();
    }
    7.完整源代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{text-align: center}
            canvas{border:1px solid greenyellow}
        </style>
    </head>
    <body>
            <h1>canvas绘制验证码</h1>
            <canvas width="120" height="40" id="c1">
            </canvas>
            <script>
                //1.新建一个函数产生随机数
                function rn(min,max){
                    return  parseInt(Math.random()*(max-min)+min);
                }
                //2.新建一个函数产生随机颜色
                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 w=120;
                var h=40;
                var ctx=c1.getContext("2d");
                ctx.fillStyle=rc(180,230);
                ctx.fillRect(0,0,w,h);
                //4.随机产生字符串
                var pool="ABCDEFGHIJKLIMNOPQRSTUVWSYZ1234567890";
                for(var i=0;i<4;i++){
                    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();
                    ctx.translate(30*i+15,15);
                    ctx.rotate(deg*Math.PI/180);
                    ctx.fillText(c,-15+5,-15);
                    ctx.restore();
                }
                //5.随机产生5条干扰线,干扰线的颜色要浅一点
                for(var i=0;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();
                }
                //6.随机产生40个干扰的小点
                for(var i=0;i<40;i++){
                    ctx.beginPath();
                    ctx.arc(rn(0,w),rn(0,h),1,0,2*Math.PI);
                    ctx.closePath();
                    ctx.fillStyle=rc(150,200);
                    ctx.fill();
                }
            </script>
    </body>
    </html>


  • 相关阅读:
    Python中替换的三种方法
    深入浅出:分布式和集群--转自码农翻身微信公众号
    如何把GitHub中的开源项目导入到Eclipse
    Socket Tools的使用
    LoadRunner 测试Socket接口函数说明
    Apache Jemeter 开发插件
    netstat 查看连接数
    redis缓存机制【转载】
    内存溢出OOM
    transform-translate位移
  • 原文地址:https://www.cnblogs.com/CodingPrince/p/7688618.html
Copyright © 2011-2022 走看看