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 相关文章推荐
Extjs入门之动态加载树代码
Apr 09 Javascript
javascript 面向对象的JavaScript类
May 04 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
jQuery scroll事件实现监控滚动条分页示例
Apr 04 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
Mar 31 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
Jun 24 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
Jul 27 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 Javascript
Openlayers显示瓦片网格信息的方法
Sep 28 Javascript
vue element-ul实现展开和收起功能的实例代码
Nov 25 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
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
详解Python编程中基本的数学计算使用
2016/02/04 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
django中forms组件的使用与注意
2019/07/08 Python
python tkinter实现屏保程序
2019/07/30 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
extern是什么意思
2016/03/10 面试题
会计主管岗位职责
2015/04/02 职场文书
就业推荐表院系意见
2015/06/05 职场文书
观看《信仰》心得体会
2016/01/15 职场文书