微信小程序分享海报生成的实现方法

作者:结一 时间:2024-05-02 17:29:49 

为了吸引更多的用户,设计好一个分享海报还是很有必要的。而小程序要生成一个海报还是有点坑的,下面分享下我们打卡小程序的一些经验。

分享海报的效果图如下:

微信小程序分享海报生成的实现方法

制作要求:

  • 海报以弹窗形式展现,各种手机型号都可以正常显示

  • 海报的内容由背景图、日期、随机的名言警句、活动的二维码及用户的参加活动的信息

  • 海报保存的图片大小为 iphone 6 的两倍图(750 * 1334)

由于看到的弹窗图片与保存的图片是两种大小,所以一开始看了些网上的其他教程,建议是搞两个 canvas 一个大的一个小的。实际过程中,采用了一个大的 canvas ,让其偏离视窗显示区域(不可见)并生成临时文件,弹窗的图片再使用 img 组件,引入临时文件,设置其高度;而保存的时候则直接下载临时文件。

虽然是实现了,但是后来在优化的过程中,这个方案也重新设计了。下面具体介绍下优化过的方案:

  • 优先使用一个 canvas 绘制二维码;

  • 弹窗的图片即为一个 canvas;

  • 分享的图片为该 canvas 导出的大图片;

  • 为了达到最佳效果,名言警句的换行录入时就处理好。

设计弹窗的图片比例

由于最后海报的图片大小为 iphone 6 的两倍图(750 * 1334),所以这里弹窗的图片也即是 canvas 的大小,设计为对应的尺寸的某个比例。

弹窗图片的高度 = 视窗的高度 - 上下留白 - 按钮的高度 - 图片与按钮的距离
imgHeight = 100vh - 40rpx * 2 - 50rpx - 15rpx

弹窗图片的宽度 /  弹窗图片的高度 = 750 / 1334
弹窗图片的宽度 = (750 / 1334) * 弹窗图片的高度

由于像素只能是整数,所以这样绘制出来的图片可能底部会有1px的空白,所以在设置高度的时候可以再减掉 1px,这不会影响视觉效果。

绘制背景图

如果是网络图片,绘制背景图之前一定要先下载该图片,可通过 wx.getImageInfo wx. downloadFile 下载图片,下载成功后将其塞进临时地址,然后使用 wx canvas 的 drawImage 绘制。注意图片的格式不能是 gif。

绘制二维码

绘制二维码换了好几个库,每个在安卓下面生成的二维码都会频现失败。查了好些资料,说是安卓绘制的时候要设置个 setTimeout,于是最终选择了weapp-qrcode,修改了其绘制的函数,增加了setTimeout(还真别说,加上二维码绘制就成功了)。


ctx.draw(false, function (e) {
 setTimeout(() => { // 修改增加的
   options.callback && options.callback(e)
 }, 20);
})

另:目前这些绘制小程序二维码的库都是在一个单独的新 canvas 中完成的,只要对源码稍作修改,就可以提供另一个接口,直接在一个现有的 canvas (表示 canvas 中一开始绘制了其他内容) 中绘制。

如果二维码扫不出来,则表示二维码绘制出了问题。但安卓微信 6.7.2 版本本身有个 bug,二维码本身是没有问题,它却不能识别。不过升级下微信版本就好了。

保存图片

  • 先要获取用户是否开启用户授权相册

  • 如果没有权限,则弹窗提示开通权限,如果有权限直接调用 saveImageToPhotosAlbum 接口保存图片

  • 如果弹窗提示接受开通权限,则调用 saveImageToPhotosAlbum 接口保存图片

  • 如果弹窗提示拒绝则再次弹窗是否去设置开通权限,如果是则进入设置权限

性能注意

经实践测试整个绘制过程其实还是很快的,但是如果有保存临时文件操作( wx.canvasToTempFilePath ),那么这个操作一般得占一半时间左右。除此之外,有个 measureText api,用来测量文字的长度,这个在实现自动换行的时候用得到,但是比较耗性能。

来源:104.116.116.112.58.47.47.105.109.119.101.98.46.105.111.47.116.111.112.105.99.47.53.99.48.100.52.102.49.56.54.49.49.97.50.53.99.99.55.98.102.49.100.56.48.48.

标签:微信小程序,海报
0
投稿

猜你喜欢

  • php中运用http调用的GET和POST方法示例

    2023-11-23 02:39:35
  • web程序员的思考

    2009-08-04 13:10:00
  • Python Flask前后端Ajax交互的方法示例

    2021-09-07 09:09:21
  • 复化梯形求积分实例——用Python进行数值计算

    2021-10-08 13:03:26
  • sqlserver 日期比较、日期查询常用语句:月的第一天,季度的第一天等

    2010-08-01 18:58:00
  • python 生成器协程运算实例

    2021-11-22 05:27:51
  • 纯CSS图片预加载

    2009-10-28 18:40:00
  • django 快速启动数据库客户端程序的方法示例

    2023-07-31 09:31:59
  • 实现框架页面iframe的背景透明方法

    2008-06-18 12:21:00
  • go语言Timer计时器的用法示例详解

    2024-04-27 15:39:38
  • python tkinter canvas 显示图片的示例

    2022-01-27 12:40:38
  • mysql 5.7.23 winx64解压版安装教程

    2024-01-26 01:41:09
  • Anaconda使用IDLE的实现示例

    2023-05-09 10:40:39
  • .Net行为型设计模式之访问者模式(Visitor)

    2024-05-13 09:18:14
  • python实现字符串和字典的转换

    2023-03-02 02:57:18
  • 详解Laravel模型事件和模型事件在Trait中的使用

    2023-06-17 17:19:28
  • 三层级联动的日期选择下拉框javascript源码

    2013-08-15 16:50:40
  • Python中的 if 语句及使用方法

    2022-12-19 16:35:10
  • python查看矩阵的行列号以及维数方式

    2021-03-25 20:24:58
  • 将Sql Server对象的当前拥有者更改成目标拥有者

    2024-01-13 04:41:00
  • asp之家 网络编程 m.aspxhome.com