用 canvas 和 js 生成验证码

本文介绍了如何利用HTML5的canvas和JavaScript来生成验证码。主要内容包括生成干扰点、干扰线以及字符的步骤,并提供了实现验证码刷新功能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

验证码的生成


茶前饭后之余,我们来说一下如何用 H5 的 canvas 和 JavaScript 来生成一个完美的验证码。

 

生成验证码的主要步骤分为三步:生成干扰点、生成干扰线、生成字符,下面开始我的表演。

 

当然我们在进行主要步骤之前我们得需要一个 canvas 对象

//html
点击图片重新生成验证码
<p>
    <input type="text" class="topAlign" id="verify" name="verify" required>
    <canvas width="100" height="40" id="verifyCanvas"></canvas>
    <img id="code_img">
</p>
<button id="submit" type="submit">提交</button>

接下来我们在 script 标签获取到这个 canvas 对象

//script
var canvas = document.getElementById("verifyCanvas"); //获取HTML端画布
var ctx = canvas.getContext("2d"); //获取画布2D上下文
  • 生成干扰点

那么点是如何绘制出的呢?其实点就是长宽很小的矩形,因为过小的原因,在我们看来就好像一个点。所以在绘制点的时候我们只需要绘制你固定个数的点就行。

for(let i=0; i < 200;i++){                     //循环绘制 700 个点
    let randx = Math.random()*canvas.width      //生成随机生成点的横坐标
    let randy = Math.random()*canvas.height     //生成随机生成点的纵坐标
    ctx.fillStyle = 'rgb(164, 13, 253)'         //生成的点的填充颜色 
    ctx.fillRect(randx,randy,1,1)               //绘制点
}

 

  • 生成干扰线

干扰线是就是在画布上在随机的位置上生成随机长度的线,就是这么简单。

for(let i =0; i< 3; i++){   //绘制3条线
    ctx.moveTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() *         canvas.height));    //绘制线的初始位置
    ctx.lineTo(Math.floor(Math.random() * canvas.width), Math.floor(Math.random() * canvas.height));    //绘制线的末位置
    ctx.lineWidth = 0.5; //设置线的宽度
    ctx.strokeStyle = 'black';  //设置线的颜色
    ctx.stroke();   //绘制
}

 

  • 生成字符

生成字符就是把 26 个字母的大小写和数组存到一个数组中,绘制字符的时候随机到数组中取出固定个数的字符然后绘制就行了。

let nums = ["2", "3", "4", "5", "6", "7", "8", "9", "0", 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 'N', 'P', 'Q', 'R','S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',  'm','n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z']
//常识告诉我们要去掉 0、O、1、l 这四个字符,因为不好辨别
let vertify = []    //保存验证码
for(let i =0; i<4; i++){    //生成四个字符
        vertify.push(nums[Math.floor(Math.random()*nums.length)])   //随机获取四个字符并保存
      }
      ctx.font = "25px Arial";  //设置绘制的字体和大小
      ctx.fillText(vertify.toString(),10,25)    //在指定地方绘制字符
} 

 

  • 实现刷新功能

这个功能比较简单,只需要在绘制验证码封装的函数执行之前清除掉原来画板上的验证码就可以实现刷新了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值