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选择器 $实现原理
Dec 02 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
详谈 Jquery Ajax异步处理Json数据.
Sep 09 Javascript
jQuery LigerUI 使用教程表格篇(1)
Jan 18 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
jquery实现全选功能效果的实现代码
May 05 Javascript
Javascript 实现计算器时间功能详解及实例(二)
Jan 08 Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
Oct 24 Javascript
详解html-webpack-plugin用法全解
Jan 22 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
Jul 09 Javascript
微信小程序在线客服自动回复功能(基于node)
Jul 03 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
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
基于python的字节编译详解
2017/09/20 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
Python 如何测试文件是否存在
2020/07/31 Python
python 实现批量图片识别并翻译
2020/11/02 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
电气工程自动化求职信
2014/03/14 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
学校通报表扬范文
2015/05/04 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
python 提取html文本的方法
2021/05/20 Python
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android
python中filter,map,reduce的作用
2022/06/10 Python