写在前面:本文所用的包需要python环境,否则部署到服务器会报错

    本文背景:
    小程序循环生成多张海报,发布后在安卓机上有比较大的几率不显示(调试和体验版都正常),因为只在发布后才有问题,排查难度较大,于是想改成后端生成海报,把链接返回给前端,于是摸索了以下功能。
    后来下面的接口在本地可以实现生成海报功能了,部署到服务器却报错,根据报错提示和查资料,应该是需要python2.7环境才可以保证images包正常使用。
    因为担心以后服务器迁移会遗忘这个问题,所以最终还是决定在前端解决海报生成不显示的问题,根据多次即时发布测试的结果和网上的讨论,基本确定是安卓机异步渲染导致多张海报生成共用一个canvas标签导致的,这个问题的解决是另一个话题了,本文先记录koa里用qr-image生成二维码图片、用images合成图片生成海报的功能。

    1. /**
    2. * 需要python环境
    3. */
    4. const router = require('koa-router')();
    5. var qr = require('qr-image');
    6. var fs = require('fs');
    7. var images = require('images'); // 合成图片用的包,需要python环境,否则包内有个文件会报错
    8. //获取二维码
    9. router.post('/getPoster', async (ctx) => {
    10. const { url, userId } = ctx.request.body;
    11. var baseImages = fs.readdirSync('files/poster-template'); // 海报底图
    12. try {
    13. let posterList = []; // 存储返回给前端的海报路径
    14. // 多张海报底图,循环合成最终的海报
    15. for (let i = 0; i < baseImages.length; i++) {
    16. const item = baseImages[i];
    17. const urlQRCode = qr.image(url, { size: 5 });
    18. const baseUrl = 'files/poster/'; // 开发环境
    19. const QRCodeSave = `${baseUrl}${userId}_QRCode.png`; // 二维码生成后保存的路径和命名
    20. const posterSave = `${baseUrl}${userId}_poster${i}.png`; // 最终海报要保存的路径和命名
    21. await urlQRCode.pipe(fs.createWriteStream(QRCodeSave));
    22. posterList.push(posterSave);
    23. // 合成图片需settimeout,否则异步执行,会找不到上面生成的二维码图片
    24. setTimeout(() => {
    25. images(`files/poster-template/${item}`) // 加载海报背景图像文件
    26. .draw(images(QRCodeSave), 155, 640)
    27. .save(posterSave, { // 保存图片到本地,图片质量为50
    28. quality: 30
    29. });
    30. }, 100);
    31. }
    32. ctx.body = posterList;
    33. } catch (e) {
    34. ctx.body = '生成二维码出错';
    35. }
    36. })
    37. module.exports = router;