微信小程序合成海报_微信小程序生成海报实现方式
小程序生成海报保存分享图片完全指南(包括:头像,文字)
业务在小程序中生成海报(包括用户头像和自定义文字)并且保存到本地
实现思路
利用canvas画布,把用户头像和自定义文字定位好,用户点击按钮保存到本地
注意事项 难点
小程序canvas不支持自定义宽高,反正我没找到,canvas画布大部分业务都需要全屏,响应式,至少宽100%解决方案:判断到屏幕尺寸,传到wxml 里面
远程图片不能直接使用 getImageInfo 获取,需要保存到本地解决方案:canvas直接支持远程图片,不需要使用这个api
先来个ui (嘿嘿!此图经过公司的设计授权过)
技术栈canvas
wx.createCanvasContext
wx.canvasToTempFilePath
Promise
实战
首先我们在wxml里面写一个canvas占位注意这里的宽度是100%,响应式,海报的高posterHeight 是从js里面动态计算的
根据屏幕动态计算海报的尺寸
data: {
motto: 'Hello World',
hidden: true,
userInfo: {},
hasUserInfo: false,
windowWidth: '',
posterHeight: '',
},
onLoad: function () {
const poster = {
"with": 375,
"height": 587
}
const systemInfo = wx.getSystemInfoSync()
let windowWidth = systemInfo.windowWidth
let windowHeight = systemInfo.windowHeight
let posterHeight = parseInt((windowWidth / poster.with) * poster.height)
this.setData({
windowWidth: windowWidth,
posterHeight: posterHeight
})
}
背景图片生成
const that = this
// 图片路径
const imagePath = '../../static/image/common/'
let bgimgPromise = new Promise(function (resolve, reject) {
console.log('data', that.data)
wx.getImageInfo({
src: imagePath + "base.png",
success: function (res) {
resolve(res);
}
})
});
头像直接使用远程头像初始化的时候,调取,一定在生成海报之前
此处可以存储本地,或使用状态都可以
wxml
// 可以从后端接口获取 或 官方本身远程地址
开始答题(获取用户信息)
js
getUserInfo: function (e) {
app.globalData.userInfo = e.detail.userInfo
let userInfo = e.detail.userInfo
console.log('userInfo', userInfo)
// 更新用户信息
// api.post('更新用户信息的url', userInfo)
this.setData({
userInfo: e.detail.userInfo,
hasUserInfo: true
})
},
生成海报背景和图片
wxml
bgimgPromise.then(res => {
console.log('Promise.all', res)
const ctx = wx.createCanvasContext('shareImg')
ctx.width = windowWidth
ctx.height = posterHeight
console.log(windowWidth, posterHeight)
// 背景图
ctx.drawImage('../../' + res[0].path, 0, 0, windowWidth, posterHeight, 0, 0)
// 头像
ctx.drawImage(that.data.userInfo.avatarUrl, 48, 182, 58, 58, 0, 0)
ctx.setTextAlign('center')
ctx.setFillStyle('#000')
ctx.setFontSize(22)
// ctx.fillText('分享文字2:stark.wang出品', 88, 414)
ctx.fillText('分享文字1我的博客:https://shudong.wang', 55, 414)
ctx.stroke()
ctx.draw()
})
保存到本地
onLoad: function () {
share: function () {
var that = this
wx.showLoading({
title: '正在制作海报。。。'
})
new Promise(function (resolve, reject) {
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: 444,
height: 500,
destWidth: 555,
destHeight: 666,
canvasId: 'starkImg',
success: function (res) {
console.log(res.tempFilePath);
that.setData({
prurl: res.tempFilePath,
hidden: false
})
wx.hideLoading()
resolve(res)
},
fail: function (res) {
console.log(res)
}
})
}).then(res => {
console.log(res)
this.save()
})
}
}
结果
更新头像裁剪为圆形
ctx.save() // 对当前区域保存
ctx.beginPath() // 开始新的区域
ctx.arc(73, 224, 38, 0, 2 * Math.PI);
ctx.clip(); // 从画布上裁剪出这个圆形
ctx.drawImage(res[1], 36, 186, 94, 94, 0, 0) // 把图片填充进裁剪的圆形
ctx.restore() // 恢复
上面是远程连接容易发生请求失败把头像提前存到本地存储中解决
getImg: function () {
let avatarUrl = this.data.userInfo.avatarUrl
downLoadFile(avatarUrl).then((res) => {
console.log(res)
wx.saveFile({
tempFilePath: res.data.tempFilePath,
success: function (res) {
wx.setStorageSync('avatarUrl', res.savedFilePath)
}
})
})
},
获取头像
// 头像
let promiseAvatarUrl = new Promise(function (resolve, reject) {
resolve(wx.getStorageSync('avatarUrl'))
}).catch(res=>{
console.log('catch',res)
});
背景还是不变
const that = this
let promiseBdImg = new Promise(function (resolve, reject) {
console.log('data', that.data)
wx.getImageInfo({
src: imagePath + "base1.png",
success: function (res) {
console.log('promiseBdImg', res)
resolve(res);
}
})
此时生成canvas更新
Promise.all([
promiseBdImg, promiseAvatarUrl
]).then(res => {
console.log('Promise.all', res)
const ctx = wx.createCanvasContext('shareImg')
ctx.width = windowWidth
ctx.height = posterHeight
console.log(windowWidth, posterHeight)
//主要就是计算好各个图文的位置
ctx.drawImage('../../' + res[0].path, 0, 0, windowWidth, posterHeight, 0, 0)
ctx.save() // 对当前区域保存
ctx.beginPath() // 开始新的区域
ctx.arc(73, 224, 38, 0, 2 * Math.PI);
ctx.clip(); // 从画布上裁剪出这个圆形
ctx.drawImage(res[1], 36, 186, 94, 94, 0, 0) // 把图片填充进裁剪的圆形
ctx.restore() // 恢复
ctx.setTextAlign('center')
ctx.setFillStyle('#000')
ctx.setFontSize(22)
ctx.save()
ctx.beginPath();
ctx.fillText('作者:stark.wang', 545 / 2, 130)
ctx.fillText('我的博客:http://shudong.wang', 190, 414)
ctx.stroke()
ctx.draw()
})
结果
完美
ok,如果能帮助你,请赞一个。
微信小程序合成海报_微信小程序生成海报实现方式相关推荐
- php 小程序 运动步数_微信小程序步数运动-收益讲解
不得不佩服,步数小程序的厉害之处. 把闲散的运动步数,转化成一种可量化的社交货币,流动保存起来,探索出一种门槛低,又健康的经济模式. 对用户,真金白银的刺激,免费步数换取/抵现商品,红包,充值卡等. ...
- java写微信小程序答辩问题_微信小程序毕业设计选题和毕业论文怎么写,答辩流程是怎样的?...
1. 开始准备选题 大四上学期开学时开始准备论文的,首先是确定论文主题,看自己想做什么毕业设计,可以选取之前接触过的,做过的东西,这样快一些,如果选的是没接触过的方向,一定要早点开始.打算做一个小程序 ...
- 微信小程序python自动化测试_微信小程序的自动化测试框架
微信小程序的自动化测试框架 微信发布了小程序的自动化测试框架Minium,提供了多种运行验证方式,其特点: 支持一套脚本,iOS & Android & 模拟器,三端运行 提供丰富的页 ...
- 小程序搜索框_微信小程序搜索及优化相关知识科普
生活中我们常常会用到微信小程序,但很多人不知道该如何搜索.找到小程序:而有些已经做了自己的小程序的商家,也不懂怎么提升自己的微信小程序搜索效果.所以下面就跟大家科普下这两个问题. 1.怎么搜索微信小程 ...
- 小程序 实名信息_微信小程序+商城信息管理系统
下载地址长期有效 微信商城信息管理系统(java后台+小程序) 使用方法 >温馨提示 java后台信息管理系统 微信商城小程序 >使用方法 加小编微信进行咨询 >实现功能 一:会员管 ...
- java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)
首先看一下官方文档 地址:微信小程序官方文档API登录接口 我们先对官方给的时序图进行简单的分析 1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.req ...
- 微信小程序万里目_微信小程序“注册”你不知道的秘密
很多人第一次上线小程序时是这样的: 啥?个人小程序不能选择商家自营? 好,换成企业主体. 啥?功能设置不够完整? 好,重新修改一下. 啥?简介里没有把小程序的功能写全? 好,把没写的补上. -- 好不 ...
- 拼团小程序源码_微信小程序拼团系统为什么很多商家开发
问大家一个问题,你有收到过朋友的微信小程序拼团消息吗?相信不少的人都收到过,但是一些不太了解小程序的人,对拼团系统还不太了解,西安小程序开发青云在线小编告诉您,小程序拼团模式也叫做团购模式,同样一款产 ...
- python开发小程序拼团_微信小程序新功能,正合适开发拼团类小程序|明智科技...
1.分享 微信小程序的任何一个页面都可以增加分享功能,用户可以把小程序便捷的分享给通讯录的好友和微信群.但不能分享到朋友圈. 也可以进一步理解为小程序开发者可以创造一种诱导用户分享给好友和微信群的应用 ...
- php 小程序 运动步数_【小程序+ thinkphp5】 获取微信运动数据
配置.请参看上篇文章.这里直接上代码 PHP 代码: //获取微信运动数据: public functiontest(){$code = input("code");$signat ...
最新文章
- Hive安装问题简述
- Mac的控制台命令行报错:command not found
- VS打包项目详细解析
- webdriver.chrome()禁止加载图片
- 笨方法学python(本文为阅读时从此书摘录的笔记) 第四天
- Linux下使用awk批量删除共享内存
- python read函数参数_最新Pandas.read_excel()全参数详解(案例实操,如何利用python导入excel)...
- 190220每日一句
- 怎样修改计算机系统8,win8改win7,教您win8怎么改为win7系统
- 快播(Qvod)也开始耍流氓了
- 《当程序员的那些狗日日子》(五十三)破局(中)
- 华为ensp 和secureCRT 连接
- Axure制作幻灯片轮播案例
- 【知识兔】六个Excel生成序号技巧,超级大技巧
- 不愧是大厂牛人!用Java实现象棋小游戏(附超详细,超长究极无敌代码)
- 网站推荐:快速查询 “中国传统配色” 的色值和色名
- 微信小程序实现商品列表跳转详情页
- Android GestureOverlayView详解
- 《数据库系统概论》学习总结
- React.FC详细解说