小程序生成海报保存分享图片功能怎么实现
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"小程序生成海报保存分享图片功能怎么实现",在日常操作中,相信很多人在小程序生成海报保存分享图片功能怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2025年01月19日小程序生成海报保存分享图片功能怎么实现
这篇文章主要介绍"小程序生成海报保存分享图片功能怎么实现",在日常操作中,相信很多人在小程序生成海报保存分享图片功能怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"小程序生成海报保存分享图片功能怎么实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
业务
在小程序中生成海报(包括用户头像和自定义文字)并且保存到本地
实现思路
利用canvas画布,把用户头像和自定义文字定位好,用户点击按钮保存到本地
注意事项 难点
小程序canvas不支持自定义宽高,反正我没找到,canvas画布大部分业务都需要全屏,响应式,至少宽100%
解决方案:判断到屏幕尺寸,传到wxml 里面
远程图片不能直接使用 getImageInfo 获取,需要保存到本地
解决方案:canvas直接支持远程图片,不需要使用这个api
技术栈
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 = thislet 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() })
到此,关于"小程序生成海报保存分享图片功能怎么实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
图片
海报
生成
头像
程序
用户
圆形
功能
区域
文字
画布
背景
学习
更新
信息
业务
动态
博客
尺寸
屏幕
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术与应用练习题子网
留学网络安全
应应互联网科技有限公司
方舟服务器PVE低倍推荐
odbc数据库工具
网络安全类题库
网络安全 人大代表
上海移动网络技术服务行业标准
软件开发舟山
工会网络安全问卷调查平台
云耀云服务器什么时候上市的
软件开发难还是复杂
教育局网络安全攻击演练
江苏省考网络安全防护岗位真题
期刊网数据库与期刊区别
听雪互联网根服服务器在美国
安徽制作定制软件开发
软件开发一般薪资多少
网络安全与信息化会议体会
重庆培训软件开发哪家好
中国结算总部软件开发有外包嘛
掌上电力登录不了数据库异常
网络安全类题库
芜湖市新悦网络技术有限公司
肥西网络技术咨询服务电话
辽宁省专升本网络技术基础题
网络安全工程师图
与服务器无法建立安全的链接
网络安全等级保护宣传
数据库死锁如何观察到