【代码分享】使用HTML5的Canvas绘制编码说明图片

最急在工作中遇到一个需求,根据给定的编码生成编码说明,像下面这样的效果。
在这里插入图片描述

不同含义的编码用横杠分割,然后每个编码下面用箭头指明具体的含义。下面是我使用canvas实现的代码。具体的编码宽度大家可以根据实际情况进行调整,目前我的这个方法中支持起始坐标设定,和箭头的长度设定。

预览地址:https://www.huhailong.vip/res/html/codedescribe

/*** 绘制编码说明图片* @param {起始横坐标} startX * @param {起始纵坐标} startY * @param {编码信息对象} codeDescribeObj*/
function drawCode(startX, startY, codeDescribeObj) {const canvas = document.getElementById('code-canvas');const ctx = canvas.getContext('2d');let preTextWidth = startX;  //左侧开始坐标let preTextHeight = startY; //开始高度坐标for(let i=0; i<codeDescribeObj.codeList.length; i++){ctx.font = "50px Arial";let tempText = ctx.measureText(codeDescribeObj.codeList[i]);ctx.fillText(codeDescribeObj.codeList[i], preTextWidth, preTextHeight);if(i < codeDescribeObj.codeList.length - 1){ctx.fillText('—',preTextWidth+tempText.width+10,preTextHeight - 2);}ctx.stroke();ctx.font = "16px Arial";let describeY = preTextHeight + codeDescribeObj.arrowHeightList[i];ctx.fillText(codeDescribeObj.describeList[i], preTextWidth, describeY);ctx.stroke();//绘制箭头ctx.lineWidth = 1;ctx.beginPath();ctx.moveTo(preTextWidth + 30, preTextHeight + 10);ctx.lineTo(preTextWidth + 30, describeY - 20);ctx.lineTo(preTextWidth + 25, describeY - 30);ctx.moveTo(preTextWidth + 30, describeY - 20);ctx.lineTo(preTextWidth + 35, describeY - 30);ctx.stroke();//更新坐标信息preTextWidth = preTextWidth + tempText.width + 80;}
}//定义编码信息对象
const codeDescribeObj = {codeList: ['F1','YHT','23Y','S1','8R'],describeList: ['方案代码','颜色代码','年代系列代码','品类款式代码','尺寸方向代码'],arrowHeightList: [100,300,200,150,300]
}drawCode(120, 100, codeDescribeObj);

对应的html文件和css文件如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>编码说明图片绘制</title><link rel="stylesheet" type="text/css" href="./styles.css" />
</head>
<body><div class="box"><canvas id="code-canvas" width="1000" height="600"></canvas></div><script src="./index.js"></script>
</body>
</html>
body{margin: 0;height: 100vh;display: flex;flex-direction: column;align-items: center;justify-content: center;
}
.box{text-align: center;width: 800px;
}
canvas{border: 1px solid gray;border-radius: 4px;width: 100%;
}

如果本次分享的代码对你有所帮助,或者觉得不错的话,记得点个大大的赞哦!

原文地址:【代码分享】使用HTML5的Canvas绘制编码说明图片

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

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

相关文章

Ranger 面试题及答案整理,最新面试题

Ranger 的安全模型是如何设计的&#xff1f; Ranger的安全模型设计主要基于访问控制和安全策略的管理&#xff0c;它通过以下几个关键组件实现&#xff1a; 1、策略管理&#xff1a; Ranger 提供了一个中央管理平台&#xff0c;用于定义、更新和管理安全策略。这些策略根据资…

基于RT-Thread的HC-SR04超声波驱动

前言 本次驱动用的是这款超声波&#xff0c;超声波的驱动大同小异&#xff0c;均可参考 一、引脚定义 引脚功能VCC接直流5V电TRIG接外部电路的TRIG端&#xff0c;向此引脚输入10us以上的高电平可触发超声波测距ECHO接外部电路的ECHO端&#xff0c;测距结束时该引脚会输出一…

Python框架Django入门教程

Django 是一个使用 Python 编程语言开发的、免费且开源的 Web 应用框架。它遵循 "DRY&#xff08;Dont Repeat Yourself&#xff09;" 原则&#xff0c;旨在简化创建功能丰富的、高效率的 Web 网站。Django 提供了模型-视图-控制器&#xff08;MVC&#xff09;架构的…

时尚圈的节制美学 — 奥柔拉 AVRALA的独特设计理念

在这个多元化的时代&#xff0c;女性正在经历一场前所未有的角色变革。她们不再仅仅满足于传统的社会角色&#xff0c;而是勇敢地追求个人职业发展和自我实现。在这样的背景下&#xff0c;服饰不仅仅是外在的装饰&#xff0c;更是内心故事的讲述者、个性自我的表达者、身份归属…

KaiOS Data PDN 数据建立流程

代码逻辑 APN创建 在 DataCallManager.jsm中,会对所有apnsetting创建一个datacall,其中会包含dataprofile的成员(通过apn参数来创建),在之后的流程用于直接发送到modem建立PDN。 PDN建立 1、DataCallManager.jsm -dcInterface.setupDataCall //RILNetworkInterface.c…

C语言内存泄漏及检测方法

目录 1. 内存泄漏概述 1.1 内存泄漏定义 1.2 内存泄漏的危害 1.3 内促泄漏的原因 2. C语言中的内存管理 2.1 C语言内存分配方式 2.2 C语言内存管理函数 2.3 动态内存管理注意事项 3. 内存泄漏的检测与定位 3.1 内存泄漏检测工具 3.2 内存泄漏定位方法 3.3 内存泄漏…

NX/UG二次开发—3D几何—多边形内部最大圆

多边形内部最大圆&#xff0c;为什么不能说最大内切圆&#xff1f;如果正方形或正凸多边形&#xff0c;最大内部圆是与边相切的&#xff0c;但对于不规则多边形&#xff0c;很多情况是正好经过一些凹点。 本次介绍在NX中计算封闭边界内部最大圆&#xff1a; 1、首先按顺序排序…

Spring、SpringMVC

一、Spring框架中的单例Bean是线程安全的吗&#xff1f; 【默认单例的情况下】Spring Bean并没有可变的状态&#xff08;如Service类和DAO类&#xff09;&#xff0c;即只能查不能改&#xff0c;所以没有并发问题&#xff0c;所以某种程度上来说Spring的单例Bean是线程安全的。…

【ZZULI数据结构实验】压缩与解码的钥匙:赫夫曼编码应用

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

Faiss原理及使用总结

Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个用于高效相似性搜索和密集向量聚类的库。 一、原理 向量表示与相似度度量&#xff1a;在Faiss中&#xff0c;数据通常被表示为高维向量&#xff0c;这些向量可以来自深度学习模型的特征提取&#xff0c;也可…

2024-05-11 问AI:在深度学习中,学习率是什么

文心一言 在深度学习中&#xff0c;**学习率&#xff08;Learning Rate&#xff09;**是一个非常重要的超参数&#xff0c;它控制着模型在训练过程中参数更新的步长。具体来说&#xff0c;学习率决定了在每次迭代&#xff08;或称为一个epoch&#xff09;中&#xff0c;模型根…

前端工程化之包管理器

这里写目录标题 什么是包包管理工具常用的包管理工具npmnpm 基本使用初始化搜索工具包下载安装包导入 npm 包基本流程生产依赖与开发依赖全局安装安装全部依赖安装指定版本的包删除依赖包 cnpm全局安装nrm 的使用 yarn全局安装yarn 常用命令 pnpm 【推荐使用】全局安装 什么是包…

我国吻合器市场规模不断扩大 国产化率有所增长

我国吻合器市场规模不断扩大 国产化率有所增长 吻合器是替代手工切除或缝合的一种医疗器械&#xff0c;其工作原理与订书机十分相似&#xff0c;可利用钛钉对组织进行离断或吻合。经过多年发展&#xff0c;吻合器种类逐渐增多&#xff0c;根据手术方式不同&#xff0c;吻合器大…

【JavaEE 初阶(三)】多线程代码案例

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.单例模式2.1饿汉方式2.2饿汉方式 3.阻塞队列3.1概念3.2实现 4.定时器4.1概念4.…

支付宝小程序如何去除页面下拉回弹

描述&#xff1a;支付宝小程序页面下拉时会产生回弹&#xff0c;如果页面上有拖拽功能&#xff0c;会有影响 解决方法&#xff1a; 页面xx.config.js中设置&#xff1a;allowsBounceVertical: “NO” 官方文档&#xff1a;https://opensupport.alipay.com/support/FAQ/7110b5d…

WT32-ETH01作为TCP Client进行通讯

目录 模块简介WT32-ETH01作为TCP Client设置电脑作为TCP Server设置连接并进行通讯总结 模块简介 WT32-ETH01网关主要功能特点: 采用双核Xtensa⑧32-bit LX6 MCU.集成SPI flash 32Mbit\ SRAM 520KB 支持TCP Server. TCP Client, UDP Server. UDP Client工作模式 支持串口、wif…

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

其他编程语言中调用 Python 脚本,如何设置Python脚本的相对路径

import os# 假设 script_directory 是你的脚本所在的目录 script_directory os.path.dirname(os.path.abspath(__file__))# 使用 os.path.join 来构建相对路径 relative_path_to_image os.path.join(script_directory, 合并/figure_pic2.png)# 现在你可以使用这个相对路径来加…

uni-app+vue3 +uni.connectSocket 使用websocket

前言 最近在uni-appvue3websocket实现聊天功能&#xff0c;在使用websocket还是遇到很多问题 这次因为是app手机应用&#xff0c;就没有使用websocket对象&#xff0c;使用的是uni-app的uni.connectSocket 为了方便测试这次用的是node.js一个简单的dom&#xff0c;来联调模拟…

Apache Flume Agent内部原理

Apache Flume Agent内部原理 Apache Flume 是一个可扩展的、分布式的日志收集、聚合和传输系统。在 Flume 中&#xff0c;Agent 是一个独立的进程&#xff0c;负责接收、传输和处理数据。Agent 内部包含多个组件&#xff0c;每个组件都有不同的功能和责任。 1. Source&#xff…