生成二维码 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需要指定版本

"images": "3.2.3"

否则会报错:__ZN2v87Isolate37AdjustAmountOfExternalAllocatedMemoryEx

 

 

 

posted on 2022-09-16 17:05  Mr.Winter  阅读(1435)  评论(0编辑  收藏  举报