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


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 相关文章推荐
Js 刷新框架页的代码
Apr 13 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
Jun 23 Javascript
EasyUI中combobox默认值注意事项
Mar 01 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
Mar 04 Javascript
jquery插件splitScren实现页面分屏切换模板特效
Jun 16 Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 Javascript
微信小程序 WebSocket详解及应用
Jan 21 Javascript
微信小程序 弹幕功能简单实例
Feb 14 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
vue-cli设置css不生效的解决方法
Feb 07 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 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
php设计模式 Strategy(策略模式)
2011/06/26 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
python3音乐播放器简单实现代码
2020/04/20 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
python如何从键盘获取输入实例
2020/06/18 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
先进德育工作者事迹材料
2014/01/24 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
社区创先争优承诺书
2014/08/30 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
加薪通知
2015/04/25 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
高一军训口号
2015/12/25 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL