前端canvas生成图片验证码

<template>  
  <div>  
    <canvas ref="captchaCanvas" width="150" height="50"></canvas>  
    <button @click="generateCaptcha">生成验证码</button>  
  </div>  
</template>  
  
<script>  
export default {  
  name: 'Captcha',  
  methods: {  
    generateCaptcha() {  
      const canvas = this.$refs.captchaCanvas;  
      const ctx = canvas.getContext('2d');  
  
      // 清除之前的绘制  
      ctx.clearRect(0, 0, canvas.width, canvas.height);  
  
      // 设置字体样式  
      const fontSize = 24; // 字体大小  
      ctx.font = `${fontSize}px Arial`;  
      ctx.fillStyle = '#333';  
  
      // 生成随机验证码  
      const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';  
      let captchaText = '';  
      for (let i = 0; i < 6; i++) {  
        captchaText += chars.charAt(Math.floor(Math.random() * chars.length));  
      }  
  
      // 测量文本宽度  
      const textWidth = ctx.measureText(captchaText).width;  
  
      // 计算文本居中的x坐标  
      const x = (canvas.width - textWidth) / 2;  
  
      // 假设文本高度与字体大小大致相同(对于某些字体可能不完全准确)  
      const textHeight = fontSize; // 或者使用更复杂的逻辑来计算确切的高度  
  
      // 计算文本居中的y坐标(考虑到基线位置可能在字体高度的下方)  
      // 这里我们简单地将y坐标设置为canvas高度的一半减去字体大小的一半  
      // 但对于某些字体,你可能需要调整这个值以获得更好的垂直居中效果  
      const y = canvas.height / 2 + fontSize / 2 * 0.3; // 这里的0.3是一个调整因子,可能需要根据实际字体进行调整  
  
      // 绘制验证码  
      ctx.fillText(captchaText, x, y);  
  
      // ...(添加干扰线、噪点等)  
    }  
  },  
  mounted() {  
    this.generateCaptcha(); // 组件挂载时生成一次验证码  
  }  
};  
</script>  
  
<style scoped>  
canvas {  
  border: 1px solid #ccc;  
}  
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值