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

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

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

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

javascript 复制代码
/**
 * 绘制编码说明图片
 * @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文件如下

html 复制代码
<!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>
css 复制代码
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绘制编码说明图片

相关推荐
m0_748247552 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
m0_748255022 小时前
前端常用算法集合
前端·算法
真的很上进2 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
web130933203983 小时前
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
前端·vue.js·elementui
NiNg_1_2343 小时前
Echarts连接数据库,实时绘制图表详解
前端·数据库·echarts
如若1234 小时前
对文件内的文件名生成目录,方便查阅
java·前端·python
滚雪球~4 小时前
npm error code ETIMEDOUT
前端·npm·node.js
沙漏无语4 小时前
npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
supermapsupport4 小时前
iClient3D for Cesium在Vue中快速实现场景卷帘
前端·vue.js·3d·cesium·supermap
brrdg_sefg4 小时前
WEB 漏洞 - 文件包含漏洞深度解析
前端·网络·安全