
小程序分享海报是裂变传播的重要载体。我做过一个知识付费小程序,上线海报分享功能后,用户增长了3倍。但海报生成涉及canvas绘制、图片合成、文字排版等多个环节,每个环节都有坑。今天分享我的实战经验。
首先是canvas绘制。小程序的canvas API和H5有些差异,要注意坐标系和像素比例。我第一个版本的海报在iPhone上很清晰,在安卓上就很模糊。排查后发现是devicePixelRatio的问题,高清屏上canvas要按设备像素比缩放。
我的解决方案是:用wx.getSystemInfo获取设备信息,动态计算canvas尺寸。比如设计稿是750px宽,实际canvas宽度要乘以devicePixelRatio,绘制完成后再用canvasToTempFilePath导出时设置destWidth和destHeight为原始尺寸。这样导出的图片在各种设备上都很清晰。
图片合成是难点。海报通常由背景图、用户头像、商品图、二维码等多张图片组成,需要按顺序绘制。我遇到的问题是:图片加载完成后再绘制,否则会出现图片缺失的情况。但小程序的canvas不支持异步绘制,必须用Promise.all等待所有图片加载完成,再统一绘制。
我现在的做法是:先把所有图片下载到本地临时文件,用Promise.all等待全部下载完成,再开始绘制。绘制顺序是:背景图、装饰元素、商品图、用户头像、二维码、文字。每个元素的位置和大小都是根据设计稿按比例计算的,确保在不同尺寸的海报上都能正确显示。
文字排版也很讲究。海报上的文字要适配不同长度的内容,不能写死位置。我曾经把标题位置写死,结果遇到长标题就超出边界了。后来改成根据文字长度动态计算换行和位置,标题过长时自动截断并加省略号。
字体选择要统一,中文字体推荐用系统默认字体,避免加载外部字体导致的延迟。我试过用自定义字体,结果在低端机上加载很慢,海报生成时间从1秒变成5秒,用户体验很差。后来换回系统字体,生成时间稳定在1秒以内。
生成完成后要保存到相册。小程序保存图片需要用户授权,我第一次做的时候直接调起授权,结果很多用户点了拒绝。后来改成先弹窗说明用途,再调起授权,授权率从40%提升到75%。
如果用户拒绝授权,要给提示引导手动保存。我现在的做法是:拒绝后显示一个提示框,告诉用户可以在设置里开启相册权限,同时提供重新授权按钮。保存成功后给一个toast反馈,让用户知道操作已完成。
廷云信息做海报生成时,会准备多套模板适配不同场景。比如商品海报、活动海报、成就海报,每种模板的布局和风格都不同。模板化设计能提高开发效率,也方便运营人员随时更换海报样式。这个思路我很认同,我现在维护的海报模板也有5套了。
性能方面要注意,canvas绘制是同步操作,复杂海报可能会卡顿。建议把绘制逻辑放在后台线程,或者拆分成多个步骤异步执行。海报不是做完就完事,要埋点看生成成功率和保存率,数据驱动优化。