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 编程引入命名空间的方法与代码
Aug 13 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
May 26 Javascript
vue 注册组件的使用详解
May 05 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
Jul 15 Javascript
ES6扩展运算符和rest运算符用法实例分析
May 23 Javascript
vue.js实现双击放大预览功能
Jun 23 Javascript
解决vue-photo-preview 异步图片放大失效的问题
Jul 29 Javascript
vue3+typescript实现图片懒加载插件
Oct 26 Javascript
js实现简单的倒计时
Jan 28 Javascript
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
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下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php去掉文件前几行的方法
2015/07/29 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
laravel 数据验证规则详解
2019/10/23 PHP
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
一套Java笔试题
2016/08/20 面试题
网络工程师职业规划
2014/02/10 职场文书
新党章心得体会
2014/09/04 职场文书
婚内房产协议书范本
2014/10/02 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
维稳工作承诺书
2015/01/20 职场文书
委托公证书格式
2015/01/26 职场文书
给朋友的道歉短信
2015/05/12 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫