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 相关文章推荐
Jquery为单选框checkbox绑定单击click事件
Dec 18 Javascript
js获取height和width的方法说明
Jan 06 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
Sep 23 Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
JQuery的Pager分页器实现代码
May 03 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 Javascript
使用Curl命令查看请求响应时间方法
Nov 04 Javascript
JavaScript实现的选择排序算法实例分析
Apr 14 Javascript
validationEngine 表单验证插件使用实例代码
Jun 15 Javascript
微信小程序引入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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php中显示数组与对象的实现代码
2011/04/18 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
php输入流php://input使用浅析
2014/09/02 PHP
php时间戳转换代码详解
2019/08/04 PHP
php常用的工具开发整理
2019/09/26 PHP
DOM精简教程
2006/10/03 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
js实现返回顶部效果
2017/03/10 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
大专生找工作自荐书
2014/06/10 职场文书
民主评议党员总结
2014/10/20 职场文书
中学生检讨书范文
2014/11/03 职场文书
给老婆的检讨书
2015/01/27 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
小学教师教育随笔
2015/08/14 职场文书
Minikube搭建Kubernetes集群
2022/03/31 Servers