canvas生成随机验证码

效果:

                        

import React, { useState, useEffect, useRef } from 'react';
import './index.less';
function TestPage() {
  const [code, setCode] = useState('');
  // 生成随机颜色
  function randomColor() {
    return 'rgb(' +
      Math.floor(Math.random() * 256) + ',' +
      Math.floor(Math.random() * 256) + ',' +
      Math.floor(Math.random() * 256) + ')';
  }

  // 生成随机验证码
  function generateCaptcha() {
    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var captcha = '';
    for (var i = 0; i < 4; i++) {
      captcha += chars[Math.floor(Math.random() * chars.length)];
    }
    setCode(captcha)
    return captcha;
  }

 // 绘制验证码
function drawCaptcha() {
  const canvas = canvasRef.current;
  const ctx = canvas.getContext('2d');
  var captcha = generateCaptcha();
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制颜色斑点
  for (let i = 0; i < 20; i++) { // 20 是斑点的数量,你可以根据需要修改
    ctx.beginPath();
    ctx.arc(
      Math.random() * canvas.width, // x 坐标
      Math.random() * canvas.height, // y 坐标
      Math.random() * 1, // 半径
      0, // 起始角度
      2 * Math.PI // 结束角度
    );
    ctx.fillStyle = randomColor();
    ctx.fill();
  }

  // 绘制线条
  for (let i = 0; i < 5; i++) {
    ctx.beginPath();
    ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
    ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
    ctx.strokeStyle = randomColor();
    ctx.stroke();
  }

  // 绘制验证码
  ctx.font = '30px Arial';
  for (let i = 0; i < captcha.length; i++) {
    ctx.save();
    ctx.fillStyle = randomColor();
    // 添加旋转
    ctx.rotate((Math.random() - 0.5) * Math.PI / 6);
    // 添加缩放
    ctx.scale(0.9 + Math.random() * 0.2, 0.9 + Math.random() * 0.2);
    ctx.fillText(captcha[i], 10 + i * 20, 35);
    ctx.restore();
  }
}

  useEffect(() => {
    drawCaptcha();
  }, []);
  return (
    <div>
      <div style={{margin:'20px'}}>
        <canvas ref={canvasRef} width="100" height="50" onClick={drawCaptcha}></canvas>
      </div>
    </div>

  );
}

export default TestPage;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值