小程序生成海報(bào)保存分享圖片完全指南
2020-09-27|HiShop
導(dǎo)讀:在我們分享小程序時(shí),會(huì)有一個(gè)圖片式的海報(bào),這種功能顯示是如何顯示的,下面小編為大家解答小程序生成海報(bào)保存分享圖片完全指南...
在我們分享小程序時(shí),會(huì)有一個(gè)圖片式的海報(bào),這種功能顯示是如何顯示的,下面小編為大家解答小程序生成海報(bào)保存分享圖片完全指南
業(yè)務(wù)
在小程序中生成海報(bào)(包括用戶頭像和自定義文字)并且保存到本地
實(shí)現(xiàn)思路
利用canvas畫(huà)布,把用戶頭像和自定義文字定位好,用戶點(diǎn)擊按鈕保存到本地
注意事項(xiàng) 難點(diǎn)
小程序canvas不支持自定義寬高,反正我沒(méi)找到,canvas畫(huà)布大部分業(yè)務(wù)都需要全屏,響應(yīng)式,至少寬100%
解決方案:判斷到屏幕尺寸,傳到wxml 里面
遠(yuǎn)程圖片不能直接使用 getImageInfo 獲取,需要保存到本地
解決方案:canvas直接支持遠(yuǎn)程圖片,不需要使用這個(gè)api
技術(shù)棧
- canvas
- wx.createCanvasContext
- wx.canvasToTempFilePath
- Promise
實(shí)戰(zhàn)
首先我們?cè)趙xml里面寫(xiě)一個(gè)canvas占位
注意這里的寬度是100%,響應(yīng)式,海報(bào)的高posterHeight 是從js里面動(dòng)態(tài)計(jì)算的
<canvas canvas-id="starkImg" style="width:100%;height:{{posterHeight}}px;"></canvas>
根據(jù)屏幕動(dòng)態(tài)計(jì)算海報(bào)的尺寸
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); } }) });
頭像直接使用遠(yuǎn)程頭像
初始化的時(shí)候,調(diào)取,一定在生成海報(bào)之前
此處可以存儲(chǔ)本地,或使用狀態(tài)都可以
wxml
// 可以從后端接口獲取 或 官方本身遠(yuǎn)程地址 <button class="share" type="primary" open-type="getUserInfo" bindgetuserinfo="getUserInfo">開(kāi)始答題(獲取用戶信息)</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 }) },
生成海報(bào)背景和圖片
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: '正在制作海報(bào)。。。' }) 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() // 對(duì)當(dāng)前區(qū)域保存 ctx.beginPath() // 開(kāi)始新的區(qū)域 ctx.arc(73, 224, 38, 0, 2 * Math.PI); ctx.clip(); // 從畫(huà)布上裁剪出這個(gè)圓形 ctx.drawImage(res[1], 36, 186, 94, 94, 0, 0) // 把圖片填充進(jìn)裁剪的圓形 ctx.restore() // 恢復(fù)
上面是遠(yuǎn)程連接容易發(fā)生請(qǐng)求失敗
把頭像提前存到本地存儲(chǔ)中解決
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); } })
此時(shí)生成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) //主要就是計(jì)算好各個(gè)圖文的位置 ctx.drawImage('../../' + res[0].path, 0, 0, windowWidth, posterHeight, 0, 0) ctx.save() // 對(duì)當(dāng)前區(qū)域保存 ctx.beginPath() // 開(kāi)始新的區(qū)域 ctx.arc(73, 224, 38, 0, 2 * Math.PI); ctx.clip(); // 從畫(huà)布上裁剪出這個(gè)圓形 ctx.drawImage(res[1], 36, 186, 94, 94, 0, 0) // 把圖片填充進(jìn)裁剪的圓形 ctx.restore() // 恢復(fù) 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() })
以上是小程序生成海報(bào)保存分享圖片完全指南,更多小程序開(kāi)發(fā)內(nèi)容,請(qǐng)查看本網(wǎng)站,謝謝。
HiShop小程序工具提供多類型商城/門(mén)店小程序制作,可視化編輯 1秒生成5步上線。通過(guò)拖拽、拼接模塊布局小程序商城頁(yè)面,所看即所得,只需要美工就能做出精美商城。更多小程序商店請(qǐng)查看:小程序商店