--所需模块
异步流程控制模块 async 基本使用 : http://blog.csdn.net/zzwwjjdj1/article/details/51857959
生成二维码模块 qr-image
处理图片模块 images
安装模块 npm install async qr-image images
注意:node6.9以上版本模块安装images模块会加载失败
直接https://github.com/zhangyuanwei/node-images下载新版
解决 /lib64/libc.so.6: version `GLIBC_2.14' not found 的问题http://stuart.blog.51cto.com/728677/1840205
--封装方法
1.生成二维码方法
2.嵌入水印方法
封装QrCode模块
/**
* 根据地址生成二维码
*/
"use strict"; //严格模式
var fs = require('fs');
var qr = require('qr-image');
//注意,若加载失败跟node版本有关,有问题联系xujingzhong
var images = require('images');
var path = require('path');
var config = require('../config');
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var dayurl = config.realUrl + 'public/uploads/qr/' + year + '/' + month + '/' + day;
var fileRoot = '/uploads/qr/' + year + '/' + month + '/' + day + '/';
module.exports = {
/**
* 参数 url(string) 地址
* 参数 imgName(string) 二维码名
* 参数 callback(Function)
*/
createQr : function(url, imgName, callback) {
mkdirsSync(dayurl);
var qr_png = qr.image(url, {type: 'png', size: 6});
var imgName = imgName || Date.parse(date) + Math.ceil(Math.random() * 89 + 10) + '.png';
var path = dayurl+ '/' + imgName;
var qr_pipe = qr_png.pipe(fs.createWriteStream(path));
qr_pipe.on('error', function(err){
console.log(err);
if (callback) {
callback({filePath: ''});
}
return;
})
qr_pipe.on('finish', function () {
if (callback) {
var filePath = fileRoot + imgName;
// 若要结合给图片加水印则要全部路径
var allPath = dayurl + '/' + imgName;
callback({filePath: filePath, allPath: allPath});
}
})
},
/**
* 给图片添加水印
* 参数 sourceImg(string) 原图片路径
* 参数 waterImg(string) 水印图片路径
* 参数 callback(Function)
*/
addWater : function(sourceImg, waterImg, callback){
var lastput = 'qr_' + sourceImg;
images(sourceImg) //Load image from file
//加载图像文件
.size(400) //Geometric scaling the image to 400 pixels width
//等比缩放图像到400像素宽
.draw(images(waterImg), 70, 260) //Drawn logo at coordinates (70,260)//为了遮住不该看的东西..
//在(10,10)处绘制Logo
.save(lastput, { //Save the image to a file,whih quality 50
quality : 50 //保存图片到文件,图片质量为50
});
callback(lastput);
}
}
//递归创建目录 同步方法
function mkdirsSync(dirname){
if(fs.existsSync(dirname)){
return true;
}else{
if(mkdirsSync(path.dirname(dirname))){
fs.mkdirSync(dirname);
return true;
}
}
}
直接调用
"use strict"; //严格模式
var QrCode = require('../utils/QrCode');
var async = require('async');
exports.baseUpload = function(req, res){
//直接生成二维码图片调用
QrCode.createQr('http://www.baidu.com', '', function(ressult){
return res.json(ressult.filePath);
});
//图片结合二维码调用
var task1 = function(callback){
QrCode.createQr('http://www.baidu.com', '', function(ressult){
callback(null,ressult.filePath);
});
};
var task2 = function(waterImg, callback){
//原图
var sourceImg = '1.jpg';
QrCode.addWater(sourceImg, waterImg, function(data){
callback(null, data);
})
};
async.waterfall([task1,task2], function(err, result){
if(err){
console.log(err);
return;
}
return res.json(1);
})
}