node生成带logo的二维码的中间件

Posted twinkle||cll

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node生成带logo的二维码的中间件相关的知识,希望对你有一定的参考价值。

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;

以上是关于node生成带logo的二维码的中间件的主要内容,如果未能解决你的问题,请参考以下文章

你好,请问中间带图片的二维码如何生成,谢谢

使用 Qrcode 生成中间带 logo 的二维码!

Unity怎么制作中心带logo的二维码

如何在二维码里添加logo

phpqrcode 分别生成普通带logo带背景带logo二维码

Java制作二维码代码,中间带logo图片,可设置logo大小