js将文字填充与canvas画布再转为图片
需求:封装consul服务的webUI;
原因:展示consul的服务信息时,需要嵌套动画,由于其没有内置的icon,所以将服务name放于图片位;
分析:展示信息时采用了卡片式的服务布局,缩放式的服务卡片,只有将服务名称作为图片才能实现动画效果;
最基础动画:->
实现:将服务名称置于canvas画布中,再将画布转为图片
代码实现:
1、获取dom
/**
* 获取service卡片中img对象并赋值src
* @param serviceName 服务名称
*/
setImageSrc(serviceName) {
//因为src不是该HTMLElement类型的属性,而是HTMLImageElement。
let image = <HTMLImageElement>document.querySelector("#nameImage" + serviceName);
image.src = this.canvasWrapText({canvas:<HTMLElement>document.querySelector("#canvas" + serviceName),text: serviceName});
}
2、画布=>图片
/**
* 绘制文字到canvas,判断换行位置,和设置canvas高度
* @param options canvas画布对象
*/
canvasWrapText(options) {
let settings = {
canvas:document.getElementsByTagName("canvas")[], //canvas对象,必填,不填写默认找到页面中的第一个canvas
canvasWidth:, //canvas的宽度
drawStartX:, //绘制字符串起始x坐标
drawStartY:, //绘制字符串起始y坐标
lineHeight:, //文字的行高
font:"24px 'Microsoft Yahei'", //文字样式
text:"请修改掉默认的配置", //需要绘制的文本
drawWidth:, //文字显示的宽度
color:"#000000", //文字的颜色
textAlain: "center",
backgroundColor:"#ffffff", //背景颜色
}; //将传入的配置覆盖掉默认配置
if(!!options && typeof options === "object"){
for(let i in options){
settings[i] = options[i];
}
} //获取2d的上线文开始设置相关属性
let canvas = settings.canvas;
canvas.width = settings.canvasWidth;
let ctx = canvas.getContext("2d"); //绘制背景色
ctx.fillStyle = settings.backgroundColor;
ctx.fillRect(,,canvas.width,canvas.height); //绘制文字
ctx.font = settings.font;
ctx.fillStyle = settings.color;
// @ts-ignore
ctx.textAlign = settings.textAlain;
let lineWidth = ; //当前行的绘制的宽度
let lastTextIndex = ; //已经绘制上canvas最后的一个字符的下标
//由于改变canvas 的高度会导致绘制的纹理被清空,所以,不预先绘制,先放入到一个数组当中
let arr = [];
for(let i = ; i< settings.text.length; i++){
//获取当前的截取的字符串的宽度
lineWidth = ctx.measureText(settings.text.substr(lastTextIndex,i-lastTextIndex)).width; if(lineWidth > settings.drawWidth){
//判断最后一位是否是标点符号
if(judgePunctuationMarks(settings.text[i-])){
arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex));
lastTextIndex = i;
}else{
arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex-));
lastTextIndex = i-;
}
}
//将最后多余的一部分添加到数组
if(i === settings.text.length - ){
arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex+));
}
} //根据arr的长度设置canvas的高度
canvas.height = arr.length*settings.lineHeight+settings.drawStartY; ctx.font = settings.font;
ctx.fillStyle = settings.color;
for(let i =; i<arr.length; i++){
ctx.fillText(arr[i],settings.drawStartX,settings.drawStartY+i*settings.lineHeight);
}
//判断是否是需要避开的标签符号
function judgePunctuationMarks(value) {
let arr = [".",",",";","?","!",":","\"",",","。","?","!",";",":","、"];
for(let i = ; i< arr.length; i++){
if(value === arr[i]){
return true;
}
}
return false;
}
return canvas.toDataURL();
}
注:关于代码实现中的关键节点都有详细的注解,此处不再累赘。
3、html:
<div class="member-image">
<!--为了将文字渲染为图片所设置的样例canvas-->
<canvas id="canvas{{card.name}}" width="" height="" style="background-color:#ffffff;display: none;"></canvas>
<img id="nameImage{{card.name}}" alt="Member">
</div>
注:html代码中有遍历,不可直接使用
js将文字填充与canvas画布再转为图片的更多相关文章
- 关于Chrome和Opera中draw Image()方法无法在canvas画布中绘制图片的问题
var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); var img=d ...
- selenium webdriver 实现Canvas画布自动化测试
https://blog.csdn.net/xiaoguanyusb/article/details/80324210 由借鉴意义, 转过来 canvas 是一个画布,定位元素时只能定位到画布上,如下 ...
- H5如何用Canvas画布生成并保存带图片文字的新年快乐的海报
摘要:初略算了算大概有20天没有写博客了,原本是打算1月1号元旦那天写一个年终总结的,博客园里大佬们都在总结过去,迎接将来,看得我热血沸腾,想想自己也工作快2年了,去年都没有去总结一下,今年势必要总结 ...
- Particles.js基于Canvas画布创建粒子原子颗粒效果
文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...
- canvas 画布 文字描边
总结一下,canvas 画布 文字描边的2种方法以及其不同的视觉效果: 效果图: 具体代码: <canvas id="canvas" width="800" ...
- [技术博客]海报图片生成——小程序canvas画布
目录 背景介绍 canvas简介 代码实现 难点讲解 圆角矩形裁剪失败之PS的妙用 编码不要过硬 对过长的文字进行截取 真机首次生成时字体不对 drawImage只能使用本地图片 背景介绍 目标:利用 ...
- H5 新增标签canvas 画布
canvas是写在body中的标签,设置宽高后,通过JS来往其中绘制想要的内容, canvas可以理解为一个画板,而JS就是你的画笔. 1.获取到画布 var canvas = document.ge ...
- [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)
接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...
- [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...
随机推荐
- Linux 文件系统磁盘空间与连接文件
磁盘与目录的容量 我们知道磁盘的整体数据hi在superblock块中,但是各文件的容量则在inode中记载. df:列出文件系统的整体磁盘使用量 由于df主要读取的数据几乎都是针对整个文件系统,因此 ...
- 团队作业-Beta冲刺(3/4)
队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...
- 第05组Alpha冲刺(1/4)
队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪些任务:SVN管理工具搭建 展示G ...
- rk3288 usb无线网卡支持 8188eu
第一部分是kernel 内核配置参考rk文档,把device driver 下wireless相关的先勾选上. 编译到buildin有问题,识别不到,所以打算编译成ko cd kernel/driv ...
- MySQL导入csv文件内容到Table及数据库的自增主键设置
写在前面 目的是测试将csv文件内容导入到表中, 同时记录一下自增主键的设置. 测试采用MySQL8.0. 新建表customer_info如下, 未设置主键. 修改上表, 添加主键id, 并设置为自 ...
- Mysql中的Date转换
一.背景 Mysql中有张表,表的一列为Date类型. 1. 插入日期xxx.setCreateTime(new Date())mybatis.insert(xxx) 2. 读取日期用Mybaitis ...
- 《你必须知道的javascript(上)》- 2.this与对象原型
1 关于this 1.1 为什么使用this 随着你的使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用this则不会这样.当我们介绍对象和原型时,你就会明白函数可以自动引用合适的上下 ...
- 001-mac搭建Python开发环境、Anaconda、zsh兼容
一.概述 mac下搭建python环境推荐使用Anaconda+Pycharm. 1.1.Anaconda Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学.机器 ...
- 利用Termux在Android手机上运行PHP
从 阮一峰 博客看到 [Termux 入门教程:架设手机 Server 下载文件] 想测试下,在可以跑PHP吗?经测试PHP完美运行,并且可用使用PHP内置WEB服务器,搭建网站访问:因为对linux ...
- 新手Docker入门
what's the Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植 ...