生成二维码 qr-image
import qr = require('qr-image');
const qr_code = qr.image(text);
生成的qr_code是一个可读流NodeJS.ReadableStream。
可以直接存文件,把这个读流管连到一个新创建的写流
qr_code.pipe(fs.createWriteStream(`./${text}.jpg`));
也可以从读流里获取缓冲
const buffer = await streamToBuffer(qr_code);
需要些一个同步的获取方法streamToBuffer
async function streamToBuffer(stream) { return new Promise((resolve, reject) => { const buffers = []; stream.on("error", reject); stream.on("data", (data) => buffers.push(data)); stream.on("end", () => resolve(Buffer.concat(buffers))); }); }
再同步的写入文件
fs.writeFileSync(`./${text}.jpg`, buffer);
或者给images用,images获取Buffer或者文件的路径
images(buffer).save(`./${text}.jpg`, {});
生成文字图片 text-to-svg svg2png
text-to-svg生成svg矢量图,svg2png转成png
const TextToSVG = require('text-to-svg'); const svg2png = require('svg2png');
async function buildTextSVG(text) { const textToSVG = TextToSVG.loadSync('./fonts/simhei.ttf'); const svg = textToSVG.getSVG(text, { x: 0, y: 0, fontSize: 72, anchor: 'top', }); const png = await svg2png(svg); return png; } const png_real_name = await buildTextSVG(text); images(png_real_name).save(`./{text}.png`, {});
不指定字库,使用默认字库,有些字显示不出来,simhei.ttf 这个文件有20M
const textToSVG = TextToSVG.loadSync();
图片拼接 images
整个背景将生成的二维码和文字图片拼接在一起
import images = require('images'); images(template) .draw(images(qrCode), x1, y1) .draw(images(png_real_name), x2, y2) .save(result, {});
从网上下载图片
图片存在oss上,使用需要下载下来
async downloadPic(url: string, savePath: string) { return new Promise<void>((resolve, reject) => { http.get(url, response => { let data = ''; response.setEncoding('binary'); response.on('data', chunk => { data += chunk; }); response.on('end', () => { fs.writeFile(savePath, data, 'binary', err => { if (err) { reject(err); } else { resolve(); } }); }); }).on('error', err => { reject(err); }); });
}
处理完成后对过程图片进行删除
fs不能删除存在文件的文件夹,需要一个一个文件的删
async deleteAll(dir: string) { const files = fs.readdirSync(dir); for (let index = 0; index < files.length; index++) { const file = files[index]; fs.rmSync(dir + '/' + file); } fs.rmdirSync(dir); }
注 images需要指定版本