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


Posted in Javascript onDecember 10, 2018

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

分享海报的效果图如下:

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

制作要求:

  • 海报以弹窗形式展现,各种手机型号都可以正常显示
  • 海报的内容由背景图、日期、随机的名言警句、活动的二维码及用户的参加活动的信息
  • 海报保存的图片大小为 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,用来测量文字的长度,这个在实现自动换行的时候用得到,但是比较耗性能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript触发器详解
Mar 10 Javascript
js form action动态修改方法
Nov 04 Javascript
JavaScript 设计模式之组合模式解析
Apr 09 Javascript
一个简单的Node.js异步操作管理器分享
Apr 29 Javascript
node+express+jade制作简单网站指南
Nov 26 Javascript
浅析jQuery 3.0中的Data
Jun 14 Javascript
Node.js中防止错误导致的进程阻塞的方法
Aug 11 Javascript
vue实现添加标签demo示例代码
Jan 21 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
微信小程序使用request网络请求操作实例
Dec 15 Javascript
babel之配置文件.babelrc入门详解
Feb 22 Javascript
在项目vue中使用echarts的操作步骤
Sep 07 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
Dec 10 #jQuery
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 #Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
Dec 10 #jQuery
微信小程序与后台PHP交互的方法实例分析
Dec 10 #Javascript
引入外部js脚本加载慢与页面白屏问题的解决
Dec 10 #Javascript
JQuery Ajax执行跨域请求数据的解决方案
Dec 10 #jQuery
发布Angular应用至生产环境的方法
Dec 10 #Javascript
You might like
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python常用正则表达式符号浅析
2014/08/13 Python
Python读取properties配置文件操作示例
2018/03/29 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
python时间time模块处理大全
2020/10/25 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
小学一年级数学教学计划
2015/01/20 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书