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插件制作 表单验证实现代码
Aug 17 Javascript
js 上下左右键控制焦点(示例代码)
Dec 14 Javascript
javascript页面上使用动态时间具体实现
Mar 18 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
Nov 09 Javascript
node+express制作爬虫教程
Nov 11 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
浅谈vue项目可以从哪些方面进行优化
May 05 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 Javascript
vue实现在进行增删改操作后刷新页面
Aug 05 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的String类代码
2010/04/20 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
js实现图片360度旋转
2017/01/22 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
python中from module import * 的一个坑
2014/07/20 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
如何理解Python中包的引入
2020/05/29 Python
详解python程序中的多任务
2020/09/16 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
出纳会计岗位职责
2014/03/12 职场文书
物流管理专业求职信
2014/05/29 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
详解Vue router路由
2021/11/20 Vue.js