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 相关文章推荐
教你如何解密js/vbs/vbscript加密的编码异处理小结
Jun 25 Javascript
javascript 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
De facto standard 世界上不可思议的事实标准
Aug 29 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
javascript闭包(Closure)用法实例简析
Nov 30 Javascript
Vue.js 中的 $watch使用方法
May 25 Javascript
Node.js模块全局安装路径配置方法
May 17 Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 Javascript
vue组件中的样式属性scoped实例详解
Oct 30 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
Jan 29 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
原生js实现简单轮播图
Oct 26 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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
php ios推送(代码)
2013/07/01 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python中List.index()方法的使用教程
2015/05/20 Python
python统计文本文件内单词数量的方法
2015/05/30 Python
python目录与文件名操作例子
2016/08/28 Python
python安装numpy&安装matplotlib& scipy的教程
2017/11/02 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
环境工程专业个人求职信
2013/12/05 职场文书
运动会解说词100字
2014/01/31 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
会计简历自我评价
2015/03/10 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
八年级作文之友情
2019/11/25 职场文书
用python画城市轮播地图
2021/05/28 Python