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 相关文章推荐
用javascript连接access数据库的方法
Nov 17 Javascript
JS 拼图游戏 面向对象,注释完整。
Jun 18 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
Mar 04 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
Dec 25 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
Mar 27 Javascript
分享12个非常实用的JavaScript小技巧
May 11 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
Jul 18 Javascript
详解JavaScript权威指南之对象
Sep 27 Javascript
vue2.x select2 指令封装详解
Oct 12 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
简单实现vue中的依赖收集与响应的方法
Feb 18 Javascript
微信小程序结合Storage实现搜索历史效果
May 18 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
3.从实例开始
2006/10/09 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python实现ID3决策树算法
2018/08/29 Python
python中join()方法介绍
2018/10/11 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
Python如何根据时间序列数据作图
2020/05/12 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
后勤主管岗位职责
2014/03/01 职场文书
大学生社团活动总结
2014/04/26 职场文书
毕业生个人总结
2015/02/28 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
Python socket如何解析HTTP请求内容
2022/02/12 Python