二维码的生成,以及在二维码中间添加图片
nodeJs 生成二维码
nodeJs 生成二维码的库有:
1 2
| 1、qrcode [github](https://github.com/soldair/node-qrcode) 2、qr-image [github](https://github.com/alexeyten/qr-image)
|
介绍使用 qr-image 生成二维码
优点
1 2 3
| 不需要任何依赖库 可生成png、svg、eps、pdf格式的图片 支持UTF_8编码
|
Usage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 介绍: //引入qr-image module var qr = require('qr-image'); //生成‘https://leibosite.github.io’信息、png类型的二维码,默认为M var qr_svg = qr.image('https://leibosite.github.io', { type: 'png' }); //将二维码输出到文件流,并生成github.png文件 qr_svg.pipe(require('fs').createWriteStream('github.png')); 完整代码: var generatorQrImage = function(qrInfo,qrPath){ var qr_svg = qr.image(qrInfo, 'H',{ type: 'png' }); var qrPa = path.join(__dirname,qrPath); qr_svg.pipe(fs.createWriteStream(qrPa)); fs.exists(qrPa,function(isExist){ if(isExist){ console.log('generator success!'); } console.log('generator fail'); }); };
|

但是这远远达不到我们的审美观,我们使用的二维码都是很炫丽的,比如:微信、支付宝,最显著的特征是在二维码中间有一个小图片,这个小图片是怎么加上去的呢?加上这个图片会对我们生成的二维码有什么影响呢?带着问题去看看二维码的原理,参考:二维码的生成细节和原理、 二维码为什么缺了一块依然可以扫出来。从这两篇文章中我们了解到:二维码的原理可以都简单概括为:在矩阵相应元素位置上用“点”表示二进制“1”, 用“空”表示二进制“0”,“点”和“空”的排列组成代码。现在我们大家所看到的二维码绝大多数是“QR码”,QR码是“Quick Response”(快速反应)的缩写,日本Denso-Wave公司发明。之所以QR码缺一部分或者被遮盖一部分也能被正确扫描,要归功于QR码在发明时的“容错度”设计,生成器会将部分信息重复表示(也就是冗余)来提高其容错度。QR码在生成时可以选择四种程度的容错度(可修正的字码量),分别是L,M,Q,H,对应7%,15%,25%,30%的容错度。也就是说,如果你在生成二维码时选择H档容错度,即使30%的图案被遮挡,也可以被正确扫描。这也就是为什么现在许多二维码中央都可以加上LOGO。
定制个性化二维码
既然我们已经了解了这些,那就开始动手定制个性化的二维码,代码实现时需要借助gm,帮助我们实现composite两张图片(以下是在mac上的环境安装)
1 2 3
| $ brew install imagemagick $ brew install graphicsmagick $ npm install gm
|
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| var smallPath = path.join(__dirname,'../public/images/headImage.png'); var githubQr = path.join(__dirname,'../public/images/githubQr.png'); var headImageRes = path.join(__dirname,'../public/images/headImageRes.png'); var logoWidth = 50; //将我们的logo resize到 50x50 gm(smallPath) .resize(logoWidth) .noProfile() .write(headImageRes,function(err){ if(err){ console.log(err.message); } console.log('resize success'); var qrImage = gm(githubQr); var githubPictureQr = path.join(__dirname,'../public/images/githubPicture.png'); //获取二维码的尺寸,并将resize 后的logo复合到二维码中间位置 qrImage.size(function(err,value){ if(!err && value){ var geometryStr = '+' + (value.width/2 - logoWidth/2) + '+' +((value.height/2 - logoWidth/2)) ; qrImage .composite(headImageRes) .geometry(geometryStr) .write(githubPictureQr,function(err){ if(err){ console.log('gm error!'); console.log(err.message); } console.log('composite success'); }); } else if(err){ console.log('size error!'); console.log(err.message); } }); });
|
效果如下:
