【代碼分享】使用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.pswp.cn/web/10072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10072.shtml
英文地址,請注明出處:http://en.pswp.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…