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

本文涉及的产品
性能测试 PTS,5000VUM额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: node生成带logo的二维码的中间件

node生成带logo的二维码


使用的包:

npm install --save qrcode 生成二维码

npm install sharp 合并图片

或者使用 npm install --save jimp 合并图片


上效果


20201231102656987.png


代码实现


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;
相关文章
|
27天前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
17天前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
1月前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
29 1
|
2月前
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
54 1
|
2月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
53 0
|
3月前
|
JavaScript 前端开发 中间件
深入浅出Node.js中间件模式
【9月更文挑战第13天】本文将带你领略Node.js中间件模式的魅力,从概念到实战,一步步揭示如何利用这一强大工具简化和增强你的Web应用。我们将通过实际代码示例,展示中间件如何在不修改原有代码的情况下,为请求处理流程添加功能层。无论你是前端还是后端开发者,这篇文章都将为你打开一扇通往更高效、更可维护代码的大门。
|
4月前
|
JavaScript 中间件 开发者
深入浅出Node.js中间件机制
【8月更文挑战第31天】本文将带你领略Node.js中间件的奥秘,通过直观的案例分析,揭示其背后的设计哲学。你将学会如何运用中间件构建强大而灵活的后端应用,以及在面对复杂业务逻辑时如何保持代码的清晰与高效。
|
4月前
|
设计模式 JavaScript 中间件
深入浅出Node.js中间件机制
【8月更文挑战第31天】在Node.js的世界里,中间件如同魔法般存在,它让复杂的请求处理变得井然有序。本文将带你领略中间件的奥秘,从原理到实战,一步步揭开它的神秘面纱。你将学会如何运用中间件来构建强大而灵活的后端应用,就像拼乐高一样有趣。
|
3月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
2月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
34 2