vue中怎么根据选择的名称 生成印章图片

news2024/11/17 16:01:09

项目中需要根据选择的印章名称,动态生成印章 ,印章下方显示当前的日期 代码如下

<template>
  <div>
    <label for="name">选择名称:</label>
    <select id="name" v-model="selectedName">
      <option value="name1">名称1</option>
      <option value="name2">名称2</option>
      <option value="name3">名称3</option>
    </select>

    <button @click="generateStampImage">生成印章图片</button>

    <div ref="stampContainer" v-if="stampGenerated">
      <img :src="stampImage" alt="印章" />
    </div>
  </div>
</template>

export default {
  data() {
    return {
      selectedName: '',
      stampGenerated: false,
      stampImage: ''
    };
  },
methods: {
    generateStampImage() {
      const stampText = this.selectedName;
      const canvas = document.createElement("canvas");
      canvas.width = 100; // 缩小印章尺寸
      canvas.height = 100;

      const ctx = canvas.getContext("2d");

      // 绘制圆形边框
      ctx.beginPath();
      ctx.arc(80, 80, 75, 0, 2 * Math.PI, false);
      ctx.fillStyle = "white";
      ctx.fill();
      ctx.lineWidth = 3;
      ctx.strokeStyle = "red";
      ctx.stroke();

      // 绘制五角星
      this.drawStar(ctx, 80, 80, 5, 30, 15); // 适当调整五角星大小
      ctx.fillStyle = "red";
      ctx.fill();

      // 绘制弧形文本
      this.drawCircularText(ctx, stampText, 80, 80, 60, -Math.PI / 2, "red"); // 调整文本的起始角度

      // 绘制日期
      ctx.font = "14px Arial";
      ctx.fillStyle = "red";
      ctx.textAlign = "center";
      ctx.fillText(this.currentDate, 80, 120); // 日期显示在五角星下方

      const stampImage = canvas.toDataURL("image/png");
      this.stampGenerated = true;
      this.stampImage = stampImage;
    },
    drawStar(ctx, cx, cy, spikes, outerRadius, innerRadius) {
      let rot = (Math.PI / 2) * 3;
      let x = cx;
      let y = cy;
      const step = Math.PI / spikes;

      ctx.beginPath();
      ctx.moveTo(cx, cy - outerRadius);
      for (let i = 0; i < spikes; i++) {
        x = cx + Math.cos(rot) * outerRadius;
        y = cy + Math.sin(rot) * outerRadius;
        ctx.lineTo(x, y);
        rot += step;

        x = cx + Math.cos(rot) * innerRadius;
        y = cy + Math.sin(rot) * innerRadius;
        ctx.lineTo(x, y);
        rot += step;
      }
      ctx.lineTo(cx, cy - outerRadius);
      ctx.closePath();
    },
     drawCircularText(ctx, text, x, y, radius, color) {
      ctx.fillStyle = color;
      ctx.font = '16px Arial';
      ctx.textBaseline = 'middle';

      let startAngle = -Math.PI; // 开始于水平左侧
      let totalAngle = 0; // 计算总角度

      // 计算文本占据的总角度
      for (let i = 0; i < text.length; i++) {
        totalAngle += ctx.measureText(text[i]).width / radius;
      }

      // 调整开始角度,使文本居中
      startAngle += (Math.PI - totalAngle) / 2;

      for (let i = 0; i < text.length; i++) {
        const char = text[i];
        const charWidth = ctx.measureText(char).width;
        const angle = startAngle + charWidth / (2 * radius);

        ctx.save();
        ctx.translate(x + Math.cos(angle) * radius, y + Math.sin(angle) * radius);
        ctx.rotate(angle + Math.PI / 2);
        ctx.fillText(char, -charWidth / 2, 0);
        ctx.restore();

        startAngle += charWidth / radius;
      }
    },
}

}

使用的地方调用: this.generateStampImage();即可
生成的效果如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1242326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql查询统计最近12个月的数据

项目场景&#xff1a; mysql查询统计最近12个月的数据&#xff0c;按每个月纵向展示&#xff0c;效果图 sql语句 注意&#xff1a;count( v.uuid ) 这里的是被统计那张表的id SELECT m.month,count( v.uuid ) AS total FROM (SELECT DATE_FORMAT(( CURDATE()), %Y-%m ) AS mon…

uniapp 适配部分IPhone手机底部安全距离

部分 IOS 机型&#xff0c;比如 Iphone X 的屏幕底部有一条“小黑线”区域&#xff0c;uniapp 项目中我们可以使用CSS的 env(safe-area-inset-bottom) 语句来自适配 IOS 的底部安全区域高度&#xff0c;这个语句会返回该机型的底部安全区域高度&#xff08;单位 px&#xff09;…

Linux日志切割神器logrotate原理介绍和配置详解

文章目录 前言logrotate运行机制方式1 contab模式方式2 Systemd模式 logrotate原理Linux 文件操作机制createcopytruncate 运行logrotatelogrotate参数说明本文参考连接 前言 在Linux环境中能够帮助我们分析问题蛛丝马迹的有效办法之一便是日志&#xff0c;常见的如操作系统sy…

TIVA LaunchPad V3版本飞控代码阶段性更新日志20230820

TIVA LaunchPad V3版本飞控代码阶段性更新日志&#xff1a; 20230820主要更新如下 1、增加了2023年TI电子设计竞赛G题空地协同智能消防系统基础发挥部分&#xff0c;国一得奖标准复现学习训练方案 https://www.bilibili.com/video/BV17z4y1P7pf/ https://blog.csdn.net/u01…

vue3组件化开发页面之渲染函数实现

文章目录 前言一、渲染机制虚拟 DOM渲染管线 二、渲染函数基本用法声明渲染函数Vnodes 必须唯一 三、页面使用渲染函数及组件配置总结如有启发&#xff0c;可点赞收藏哟~ 前言 组件化开发是目前开发的常态 本文记录页面拆分多个不同组件模块&#xff0c;然后再基于渲染函数实现…

使用whisper实现语音转文本

项目地址&#xff1a;GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision 1、需要py3.8环境 conda activate p38 2、安装 pip install -U openai-whisper 3、下载项目 pip install githttps://github.com/openai/whisper.git 4、安装…

咖啡馆管理系统点餐外卖小程序效果如何

咖啡一直是很多人喜欢的饮品&#xff0c;比如有些地区的人非常喜欢&#xff0c;熬夜加班醒脑等&#xff0c;咖啡领域市场规模逐年增加&#xff0c;相应的从业商家也在增加&#xff0c;近些年随着线上生态崛起&#xff0c;传统线下咖啡馆经营痛点显露出来。 通过【雨科】平台搭建…

Class文件转Java文件

目录 1、下载一个反编译工具2、在文件夹下打开命令窗口3、在此目录下随意建一个文件夹4、在打开的命令窗口输入命令5、返回解压目录下 1、下载一个反编译工具 下载链接&#xff1a;https://varaneckas.com/jad/ 下载的是第一个 下载后放至任意目录下解压即可 2、在文件夹下打…

JVM 类加载

① 类加载过程 从上面的图片我们可以看出整个 JVM 执行的流程中&#xff0c;和程序员关系最密切的就是类加载的过程了&#xff0c;所以 接下来我们来看下类加载的执行流程。 对于一个类来说&#xff0c;它的生命周期是这样的&#xff1a; 其中前 5 步是固定的顺序并且也是类加载…

泛型概述(下):泛型实现机制

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 上篇提到泛型可以看做是…

露营管理系统预约小程序效果如何

旅游经济已经复苏&#xff0c;并且市场规模增速加快&#xff0c;近一年来远途/周边游客户增多&#xff0c;不少旅游景区在节假日常常面对客流爆满现象。同时露营作为近几年突然火热的项目&#xff0c;其需求也是日渐上升。 然而在高需求的同时&#xff0c;我们也看到露营经营痛…

【SpringMVC】 参数传递

一.项目目录 SpringBoot项目创建之后会生成很多目录 删除不需要的这四个文件/目录 目录 二.Spring MVC 和 MVC Spring MVC(Spring Web MVC) Spring Web MVC 是⼀个 Web 框架 MVC : Model View Controller 它是一种思想 , 它把一个项目分成了三个部分. View视图层 界面显示…

聚水潭连接API,集成无代码开发,优化电商平台运营

聚水潭连接API&#xff0c;实现电商平台的高效运营 聚水潭作为一款SaaS ERP解决方案&#xff0c;通过其出色的产品和服务&#xff0c;迅速在市场上占据了一席之地。而其无代码开发的特点&#xff0c;为电商系统和客服系统的连接与集成提供了便利。聚水潭开放平台的优势在于&am…

Linux本地MinIO存储服务远程调用上传文件

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

labview 安捷伦 34970A 采集温度等

本文详细描述了怎么用安捷伦34970A采集温度&#xff0c;并列出了labview的下载链接&#xff0c;具有一定的参考价值。 1.必要条件&#xff1a; RS-232电缆一根 IO Libraries Suite 软件 BenchLink Data Logger 软件 软件可以在http://www.keysight.com.cn下载 检查RS-232…

2、单片机及开发板介绍

单片机介绍 单片机&#xff0c;英文Micro Controller Unit,简称&#xff1a;MCU 内部集成&#xff1a;CPU、RAM(随机存储器)、ROM&#xff08;只读存储器&#xff09;、定时器、中断系统、通讯接口等 作用&#xff1a;信息采集&#xff08;传感器&#xff09;、处理&#xff0…

解决“使用 CNKI 保存时发生错误。改为尝试用 DOI 保存。”【Bug Killed】

文章目录 简介解决办法跟新本地Zotero中茉莉花插件的非官方维护中文翻译器更新网页插件Zetero Connector中的Transtors 结语参考资料 简介 使用Chrome ➕ Zotero Connector保存中国知网&#xff08;CNKI&#xff09;的参考文献到本地的Zotero时无法正常保存&#xff0c;出现使…

《人月神话》读书笔记

文章目录 一、书名和作者二、书籍概览2.1 主要论点和结构2.2 目标读者和应用场景 三、核心观点与主题3.1 人员组织管理主题3.2 项目时间进度管理主题3.3 项目成本风险管理主题3.4 软件工程内在本质 四、亮点与启发4.1 最有影响的观点4.2 对个人专业发展的启示 五、批评与局限性…

常见树种(贵州省):011榆树、朴树、青檀、桦树、椴树、水青树、桤木

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、榆树 …

ffmpeg播放器实战(播放器流程)

1.流程图 1.main窗口创建程序窗口 程序窗口构造函数执行下面内容 2.开启播放 3.开启解码 4.开启渲染 5.反馈给ui 本文福利&#xff0c; 免费领取C音视频学习资料包学习路线大纲、技术视频/代码&#xff0c;内容包括&#xff08;音视频开发&#xff0c;面试题&#xff0c;FFmpeg…