这篇文章主要介绍“小程序生成海报保存分享图片功能怎么实现”,在日常操作中,相信很多人在小程序生成海报保存分享图片功能怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序生成海报保存分享图片功能怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
在小程序中生成海报(包括用户头像和自定义文字)并且保存到本地
利用canvas画布,把用户头像和自定义文字定位好,用户点击按钮保存到本地
解决方案:判断到屏幕尺寸,传到wxml 里面
解决方案:canvas直接支持远程图片,不需要使用这个api
canvas
wx.createCanvasContext
wx.canvasToTempFilePath
Promise
注意这里的宽度是100%,响应式,海报的高posterHeight 是从js里面动态计算的
<canvas canvas-id="starkImg" style="width:100%;height:{{posterHeight}}px;"></canvas>
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
// 可以从后端接口获取 或 官方本身远程地址 <button class="share" type="primary" open-type="getUserInfo" bindgetuserinfo="getUserInfo">开始答题(获取用户信息)</button>
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() })
到此,关于“小程序生成海报保存分享图片功能怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。