写在前面:本文所用的包需要python环境,否则部署到服务器会报错
本文背景:
小程序循环生成多张海报,发布后在安卓机上有比较大的几率不显示(调试和体验版都正常),因为只在发布后才有问题,排查难度较大,于是想改成后端生成海报,把链接返回给前端,于是摸索了以下功能。
后来下面的接口在本地可以实现生成海报功能了,部署到服务器却报错,根据报错提示和查资料,应该是需要python2.7环境才可以保证images包正常使用。
因为担心以后服务器迁移会遗忘这个问题,所以最终还是决定在前端解决海报生成不显示的问题,根据多次即时发布测试的结果和网上的讨论,基本确定是安卓机异步渲染导致多张海报生成共用一个canvas标签导致的,这个问题的解决是另一个话题了,本文先记录koa里用qr-image生成二维码图片、用images合成图片生成海报的功能。
/*** 需要python环境*/const router = require('koa-router')();var qr = require('qr-image');var fs = require('fs');var images = require('images'); // 合成图片用的包,需要python环境,否则包内有个文件会报错//获取二维码router.post('/getPoster', async (ctx) => {const { url, userId } = ctx.request.body;var baseImages = fs.readdirSync('files/poster-template'); // 海报底图try {let posterList = []; // 存储返回给前端的海报路径// 多张海报底图,循环合成最终的海报for (let i = 0; i < baseImages.length; i++) {const item = baseImages[i];const urlQRCode = qr.image(url, { size: 5 });const baseUrl = 'files/poster/'; // 开发环境const QRCodeSave = `${baseUrl}${userId}_QRCode.png`; // 二维码生成后保存的路径和命名const posterSave = `${baseUrl}${userId}_poster${i}.png`; // 最终海报要保存的路径和命名await urlQRCode.pipe(fs.createWriteStream(QRCodeSave));posterList.push(posterSave);// 合成图片需settimeout,否则异步执行,会找不到上面生成的二维码图片setTimeout(() => {images(`files/poster-template/${item}`) // 加载海报背景图像文件.draw(images(QRCodeSave), 155, 640).save(posterSave, { // 保存图片到本地,图片质量为50quality: 30});}, 100);}ctx.body = posterList;} catch (e) {ctx.body = '生成二维码出错';}})module.exports = router;
