node生成带logo的二维码
使用的包:
npm install --save qrcode 生成二维码
npm install sharp 合并图片
或者使用 npm install --save jimp 合并图片
上效果
代码实现
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;