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 相关文章推荐
用Div仿showModalDialog模式菜单的效果的代码
Mar 05 Javascript
自写的一个jQuery圆角插件
Oct 26 Javascript
利用JS延迟加载百度分享代码,提高网页速度
Jul 01 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
Aug 27 Javascript
扩展JS Date对象时间格式化功能的小例子
Dec 02 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
jQuery控制frames及frame页面JS的方法
Mar 08 Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
Jun 19 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
Sep 04 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 获取完整url地址
2008/12/20 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
给Python入门者的一些编程建议
2015/06/15 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
python3操作mysql数据库的方法
2017/06/23 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
python学生管理系统
2019/01/30 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
普通简短的个人自我评价
2014/02/15 职场文书
2014年创卫实施方案
2014/02/18 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
初中英语演讲稿
2014/04/29 职场文书
三十年同学聚会感言
2015/07/30 职场文书
心理健康教育主题班会
2015/08/13 职场文书
初中团支书竞选稿
2015/11/21 职场文书