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实现div的拖动并调整大小类似qq空间个性编辑模块
Dec 12 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
用js来刷新当前页面保留参数的具体实现
Dec 23 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
Dec 05 Javascript
canvas绘制七巧板
Feb 03 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
layui表格内放置图片,并点击放大的实例
Sep 10 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 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实现动态执行代码的方法
2016/03/25 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
js传值 判断
2006/10/26 Javascript
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
Python lambda和Python def区别分析
2014/11/30 Python
python发送邮件实例分享
2017/07/28 Python
python素数筛选法浅析
2018/03/19 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
python list多级排序知识点总结
2019/10/23 Python
8种常用的Python工具
2020/08/05 Python
html5唤起app的方法
2017/11/30 HTML / CSS
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
上海方立数码笔试题
2013/10/18 面试题
高中军训感言600字
2014/03/11 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
2015大学生求职信范文
2015/03/20 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
小人国观后感
2015/06/11 职场文书
认识实习感想
2015/08/10 职场文书
区域销售大会开幕词
2016/03/04 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
如何理解python接口自动化之logging日志模块
2021/06/15 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫