node生成带logo的二维码的中间件
Posted twinkle||cll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node生成带logo的二维码的中间件相关的知识,希望对你有一定的参考价值。
node生成带logo的二维码
使用的包:
npm install --saveqrcode
生成二维码
npm installsharp
合并图片
或者使用 npm install --savejimp
合并图片
上效果
代码实现
const express = require('express');
const router = express.Router();
const QRCode = require('qrcode');
const fs = require('fs')
const path = require('path');
const sharp = require('sharp');
/**
* 合并中间的logo
* @param oriImg 原始图片
* @param waterImg logo的水印图片
* @param targetImg 目标文件
* @param ratio 合成的比列
* @returns Promise<void>
*/
exports.mergerCntImg = async (oriImg, waterImg, targetImg, ratio = 5) =>
const [ori, water] = await Promise.all([sharp(oriImg), sharp(waterImg)])
// 通过比例进行合成
const oriHeight = await ori.metadata();
const waterHeight = Math.ceil(oriHeight.height / ratio);
const waterWidth = Math.ceil(oriHeight.width / ratio);
const waterBuffer = await water.resize(waterWidth, waterHeight).toBuffer();
// 合并图片的图片大小需要转成buffer,不能直接使用sharp对象,不然sharp也会报错
await ori.composite([input: waterBuffer]).toFile(targetImg)
router.get('/',
async (req, res, next) =>
// 下面的这些路径尽量使用绝对路径,因为node在不同平台上的路径不一样
const qrcodeName = Date.now() + '-' + Math.random().toString(36).slice(-6) + '.png';
const filePath = path.resolve(__dirname, `./../public/qrcodeImg/$qrcodeName`);
// 注意:这个地方一定要等待二维码先生成,才可以进行图片合并,不然使用哪个图片合并的库,都会报错
await QRCode.toFile(filePath,
'http://chenliangliang.top:9008',
color:
dark: '#00F', // Blue dots
light: '#0000' // Transparent background
);
// logo的图片路径
const logo = path.resolve(__dirname, './../public/favicon.jpg');
const targetFilePath = path.resolve(__dirname, `./../public/logoQrcodeImg/$qrcodeName`)
await exports.mergerCntImg(filePath, logo, targetFilePath)
// 创建文件可读流
const cs = fs.createReadStream(targetFilePath);
cs.on("data", chunk =>
res.write(chunk);
)
cs.on("end", () =>
res.status(200);
res.end();
)
)
module.exports = router;
以上是关于node生成带logo的二维码的中间件的主要内容,如果未能解决你的问题,请参考以下文章