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动 ...
随机推荐
- C语言函数内局部变量释放的坑
首先把代码贴上来: #include <stdio.h> #include<windows.h> int f(int **iptr){ ; *iptr = &a; ; ...
- 龙格-库塔法解常微分方程(c++)
用龙格库塔法计算 #include <iostream> #include<iomanip> #include <cmath> using namespace st ...
- scrapy+splash 爬取京东动态商品
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159 splash是容器安装的,从docker官网上下载windows下的 ...
- __gcd-最大公约数
__gcd-最大公约数 最大公约数(greatest common divisor,简写为gcd:或highest common factor,简写为hcf) __gcd(x,y)是algorithm ...
- 案例:使用BeautifuSoup4的爬虫
使用BeautifuSoup4解析器,将招聘网页上的招聘单位名称存储出来.其他信息可类似爬取即可 # -*- coding:utf-8 -*- from bs4 import BeautifulSou ...
- git pull push 所有分支
因为远端 git 服务器上有很多分支,一个个分支pull太麻烦,所以找了 pull 所有分支的方法,如下: git branch -r | grep -v '\->' | while read ...
- Sword 第三方库介绍一
/* 获取字符编码 */ #include <stdio.h> #include <stdlib.h> /* calloc()函数头文件 */ #include <str ...
- 腾讯云短信 nodejs 接入, 通过验证码修改手机示例
腾讯云短信 nodejs 接入, 通过验证码修改手机示例 参考:腾讯云短信文档国内短信快速入门qcloudsms Node.js SDK文档中心>短信>错误码 nodejs sdk 使用示 ...
- C#对泛型实例化对像的方法
最近在搞一个小东东,用到了泛型的处理,用到了对泛型的实例化问题.下面来讲讲对泛型的实例化,以代码为例,如: public class A { } public class B<T> { p ...
- 监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那在代码中怎样监听当点击微信.支付宝.百度糯米.百度钱包 ...