node文字生成图片的示例代码


Posted in Javascript onOctober 26, 2017

今天老板提了需求,要在服务端生成邀请卡,嗯…,简单的说就是把要这张:

node文字生成图片的示例代码

变成差多这样的:

node文字生成图片的示例代码

后端搞ruby的哥们搞了个html转图片,说转得太慢了,我就把这坑接下来了

所以睡前就倒腾了下,搞了个简单的实现

解决思路

文字转svg -> svg转png -> 合并图片

相关轮子

  1. images Node.js 轻量级跨平台图像编解码库,不需要额外安装依赖
  2. text-to-svg 文字转svg
  3. svg2png svg转png图片

示例代码

'use strict';

const fs = require('fs');
const images = require('images');
const TextToSVG = require('text-to-svg');
const svg2png = require("svg2png");
const Promise = require('bluebird');

Promise.promisifyAll(fs);

const textToSVG = TextToSVG.loadSync('fonts/文泉驿微米黑.ttf');

const sourceImg = images('./i/webwxgetmsgimg.jpg');
const sWidth = sourceImg.width();
const sHeight = sourceImg.height();

const svg1 = textToSVG.getSVG('魏长青-人人讲App', {
 x: 0,
 y: 0,
 fontSize: 24,
 anchor: 'top',
});

const svg2 = textToSVG.getSVG('邀请您参加', {
 x: 0,
 y: 0,
 fontSize: 16,
 anchor: 'top',
});

const svg3 = textToSVG.getSVG('人人讲课程', {
 x: 0,
 y: 0,
 fontSize: 32,
 anchor: 'top',
});

Promise.coroutine(function* generateInvitationCard() {
 const targetImg1Path = './i/1.png';
 const targetImg2Path = './i/2.png';
 const targetImg3Path = './i/3.png';
 const targetImg4Path = './i/qrcode.jpg';
 const [buffer1, buffer2, buffer3] = yield Promise.all([
  svg2png(svg1),
  svg2png(svg2),
 svg2png(svg3),
 ]);

 yield Promise.all([
  fs.writeFileAsync(targetImg1Path, buffer1),
  fs.writeFileAsync(targetImg2Path, buffer2),
  fs.writeFileAsync(targetImg3Path, buffer3),
 ]);

 const target1Img = images(targetImg1Path);
 const t1Width = target1Img.width();
 const t1Height = target1Img.height();
 const offsetX1 = (sWidth - t1Width) / 2;
 const offsetY1 = 200;

 const target2Img = images(targetImg2Path);
 const t2Width = target2Img.width();
 const t2Height = target2Img.height();
 const offsetX2 = (sWidth - t2Width) / 2;
 const offsetY2 = 240;

 const target3Img = images(targetImg3Path);
 const t3Width = target3Img.width();
 const t3Height = target3Img.height();
 const offsetX3 = (sWidth - t3Width) / 2;
 const offsetY3 = 270;

 const target4Img = images(targetImg4Path);
 const t4Width = target4Img.width();
 const t4Height = target4Img.height();
 const offsetX4 = (sWidth - t4Width) / 2;
 const offsetY4 = 400;

 images(sourceImg)
 .draw(target1Img, offsetX1, offsetY1)
 .draw(target2Img, offsetX2, offsetY2)
 .draw(target3Img, offsetX3, offsetY3)
 .draw(target4Img, offsetX4, offsetY4)
 .save('./i/card.png', { quality : 90 });
})().catch(e => console.error(e));

注意事项

text-to-svg需要中文字体的支持,不然中文会乱码

在我的破电脑上执行一次只花了500多毫秒,感觉足够了,分享出来希望能给大家一个参照

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Gird事件机制初级读本
Mar 10 Javascript
Script的加载方法小结
Jan 12 Javascript
DWR实现模拟Google搜索效果实现原理及代码
Jan 30 Javascript
javascript jq 弹出层实例
Aug 25 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
JavaScript类型系统之基本数据类型与包装类型
Jan 06 Javascript
基于jquery实现智能提示控件intellSeach.js
Mar 17 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
200行代码实现blockchain 区块链实例详解
Mar 14 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 jQuery
JavaScript find()方法及返回数据实例
Apr 30 Javascript
vue-cli中打包图片路径错误的解决方法
Oct 26 #Javascript
javascript+html5+css3自定义弹出窗口效果
Oct 26 #Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 #Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 #Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
Oct 26 #Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 #Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
Oct 26 #Javascript
You might like
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PHP无敌近乎加密方式!
2010/07/17 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
jQuery总体架构的理解分析
2011/03/07 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
python基于pyDes库实现des加密的方法
2017/04/29 Python
python模块smtplib学习
2018/05/22 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
怎么写好自荐信
2013/10/30 职场文书
企业后勤岗位职责
2014/02/28 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL