Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解


Posted in Javascript onAugust 07, 2019

在Node.js中,我们可以通过qr-image包直接在后台生成二维码图片,使用方法很简单:

var qr = require('qr-image');
exports.createQRImage = function(res, str){
  var img = qr.image(str); // 将生成二维码图片
  res.writeHead(200, {'Content-Type': 'image/png'});
  img.pipe(res);
};

但是如果我们希望生成的不仅仅是二维码,而是在一张给定的背景图上生成二维码,并在底部配上相应的文字说明,那么就需要借助于其它一些包来实现。

  • images包是Node.js上一个轻量级的跨平台图像处理库,可以用来进行图片的编辑和绘制。
  • svg2png用来将生成的svg转换成png图片。
  • text-to-svg用来将给定的文字转换成对应的svg。

下面是对应的实现代码:

exports.genQrImage = function (text, url) {
  const tts = textToSVG.loadSync(path.join(__dirname, '../../msyh.ttf'));
  const tSvg = tts.getSVG(text, {
    x: 0,
    y: 0,
    fontSize: 20,
    anchor: 'top'
  });
  const margin = 35; // 二维码的左右边距
  const top = 90; // 二维码距顶部的距离
  var sourceImage = images(path.join(__dirname, '../../source.png'));
  var w = sourceImage.width(); // 模板图片的宽度
  return svg2png(tSvg)
    .then((rst) => {
      var textImage = images(rst);
      var qrImage = images(qr.imageSync(url, {type: 'png'})).size(w - margin * 2); // 二维码的尺寸为:模板图片的宽度减去左右边距
      return sourceImage
        .draw(qrImage, margin, top) // 二维码的位置:x=左边距,y=top
        .draw(textImage, (w - textImage.width()) / 2, top + qrImage.height() + 10) // 底部文字,x为居中显示,y=top+二维码的高度+10
        .encode('png', {quality: 90});
    })
    .catch(e => console.error(e));
};

函数genQrImage接收两个参数,text是显示在二维码底部的文字,url是要生成的二维码地址。其中的source.png是给定的背景图片,msyh.ttf是微软雅黑的字体文件。

基本思路就是通过images库加载一张预先指定的背景图片,然后通过计算出的起始点坐标在背景图上画出二维码图片和文字。最后通过encode方法将画好的图片输出到buffer中,当然也可以通过save方法保存到服务器上。具体使用方法可以查看github上的文档。

myShareQrImage: function* (next) {
  var _text = "联系人:xxx   手机号:13200000000";
  var _url = "http://www.cnblogs.com/jaxu";
  var _buffer = yield BizUtils.genQrImage(_text, _url);
  this.res.setHeader('Content-type', 'image/png');
  this.body = _buffer;
  yield next;
}

最终生成的效果:

Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
20款效果非常棒的 jQuery 插件小结分享
Nov 18 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
javascript定义类和类的实现实例详解
Dec 01 Javascript
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
详解Vue.js入门环境搭建
Mar 17 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
May 26 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
微信小程序引入Vant组件库过程解析
Aug 06 #Javascript
Vue数据绑定实例写法
Aug 06 #Javascript
Vue代码整洁之去重方法整理
Aug 06 #Javascript
VUE写一个简单的表格实例
Aug 06 #Javascript
VUE前后端学习tab写法实例
Aug 06 #Javascript
Vue路由前后端设计总结
Aug 06 #Javascript
vue实现行列转换的一种方法
Aug 06 #Javascript
You might like
一个好用的分页函数
2006/11/16 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php的大小写敏感问题整理
2011/12/29 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python里隐藏的“禅”
2014/06/16 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
django文档学习之applications使用详解
2018/01/29 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
Python中拆分字符串的操作方法
2019/07/23 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
Python定义函数实现累计求和操作
2020/05/03 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
意大利在线药房:Saninforma
2021/02/11 全球购物
自荐信格式范文
2013/10/07 职场文书
计算机科学与技术应届生求职信
2013/11/07 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
伊索寓言教学反思
2014/05/01 职场文书
公司门卫工作职责
2014/06/28 职场文书
工作证明格式及范本
2014/09/12 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
聊聊redis-dump工具安装问题
2022/01/18 Redis
muduo TcpServer模块源码分析
2022/04/26 Redis
windows系统安装配置nginx环境
2022/06/28 Servers