推荐使用 qrcode 库生成二维码,需配置 type: 'png' 和 errorcorrectionlevel: 'h' 才能成功叠加 logo;windows 用户需预先安装 python 2.7 和 visual studio build tools 以支持 canvas;logo 必须为透明 png,用 sharp 缩放至二维码宽高的 20%~30% 后居中合成。

Node生成二维码前必须装对库
直接用 qrcode 库最稳妥,别选 qrcode-generator 或老版本 node-qrcode —— 后者不支持 logo 叠加,前者已停止维护。当前推荐安装:
npm install qrcode。注意它底层依赖
canvas,Windows 用户如果报 Cannot find module 'canvas',得先装 Python 2.7 和 Visual Studio Build Tools,或者改用 qrcode-with-logos(但功能更简陋)。Mac/Linux 用户一般无此问题。logo叠加必须用 type: 'png' + errorCorrectionLevel
默认生成的 base64 字符串无法贴 logo,必须输出为文件流或 buffer。关键配置有两项:
-
type: 'png'(不能是'terminal'或'utf8') -
errorCorrectionLevel: 'H'(高容错,否则加 logo 后容易扫不出)
const QRCode = require('qrcode');<br>QRCode.toFile('./output.png', 'https://example.com', {<br> type: 'png',<br> errorCorrectionLevel: 'H',<br> width: 512<br>});漏掉 errorCorrectionLevel 是常见失败原因——logo 占像素后,纠错不足就直接扫不出来。用 sharp 合成 logo 要控制尺寸和位置
qrcode 本身不带 logo 功能,得用 sharp 手动合成。核心逻辑是:先生成纯二维码图,再用 sharp 把 logo 缩放到二维码宽高的 20%~30%,然后居中覆盖。要点:
- logo 图像必须是透明背景 PNG,否则白底会遮盖二维码
- 缩放时用
fit: 'contain'+background: { r: 0, g: 0, b: 0, alpha: 0 }保持透明 - 合成位置用
composite的top/left计算:(qrWidth - logoWidth) / 2
await sharp('qr.png')<br> .composite([<br> { input: 'logo.png', top: 180, left: 180 }<br> ])<br> .toFile('final.png');别用 overlayWith,它不支持 alpha 通道对齐。批量处理要注意异步顺序和磁盘压力
循环里直接写 await QRCode.toFile(...) 没问题,但并发太多会触发系统文件句柄限制,尤其 Windows。稳妥做法是加个简单节流:
const promises = urls.map((url, i) =><br> QRCode.toFile(`qr_${i}.png`, url, { type: 'png', errorCorrectionLevel: 'H' })<br>);<br>await Promise.all(promises);如果要边生成边加 logo,记得等 toFile 完全写完磁盘再读取,否则 sharp 会读到空文件——加个 await setTimeout(0) 不可靠,应该用 fs.promises.access(path, fs.constants.F_OK) 确认文件存在。真正卡住的地方往往不是代码逻辑,而是 logo 图像的 DPI、透明通道是否干净,以及 Windows 下 canvas 编译失败时没看到具体错误日志。











