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 相关文章推荐
jquery中的事件处理详细介绍
Jun 24 Javascript
怎么选择Javascript框架(Javascript Framework)
Nov 22 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
js用Date对象的setDate()函数对日期进行加减操作
Sep 18 Javascript
跟我学习javascript解决异步编程异常方案
Nov 23 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
Nov 24 Javascript
Vue.js基础学习之class与样式绑定
Mar 20 Javascript
使用canvas进行图像编辑的实例
Aug 29 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 Javascript
vue-iview动态新增和删除的方法
Jun 17 Javascript
Vue scoped及deep使用方法解析
Aug 01 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
php将数据库导出成excel的方法
2010/05/07 PHP
YII框架常用技巧总结
2019/04/27 PHP
JavaScript效率调优经验
2009/06/04 Javascript
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
用实例分析Python中method的参数传递过程
2015/04/02 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
Shell如何接收变量输入
2016/08/06 面试题
室内设计自我鉴定
2013/10/15 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
秘书英文求职信
2014/04/16 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL