uniapp实现微信小程序端动态生成海报

  1. 背景:

基于uniapp实现微信小程序中商品详情的海报生成与保存

  1. 效果图:

  1. 思路:

  1. 首先把海报上需要的内容准备好,比如用户头像,商品信息,二维码等。需要注意的是,因为二维码是动态生成的,所以需要后端传给我们,前端需要把路径和参数传给后端,后端请求微信服务接口,通过配置对应的参数就可以生成一个二维码啦,再将二维码发送给前端。

  1. 图片不能是网络图片,我们需要的是本地图片,如非本地图片,那我们需要对图片进行处理。uniapp可以通过uni.getImageInfo获取图片本地路径(uni.chooseImage(OBJECT) | uni-app官网 (dcloud.net.cn))

  1. 如果通过临时路径来保存图片,canvas一倍会比较模糊,我们可以加到2或3倍,太大安卓机容易出问题,我们可以采用设备的像素作为倍率,uni.getSystemInfo获取设备信息

  1. 创建canvas绘制上下文,在绘制canvas的时候,把两个图片都切割成圆形的图片,然后中间就出现了一条线,在之后对原价进行划线删除状态的时候设置划线的颜色,会影响圆形的边线颜色。然后才知道,canvas绘图是在JS中完成,只能通过JS代码来控制,JS提供了beginPath()和closePath()两个函数来控制canvas中模块的开始和结束,这样就可以避免属性覆盖。

  1. 补充:和后端交互生成二维码,需要传参数,要注意页面路径不能再根目录前不增加/,携带的参数最大为32个可见字符,且字符有要求限制,如果不符合规范就会生成二维码失败

  1. 在页面的onLoad生命周期参数options判断options.scene是否存在,存在就是扫描二维码进入,需要对二维码返回的参数进行处理,先根据官方文档来进行解码,decodeURIComponent会将%3D解码成=,我传参的时候是通过&符号将参数之间隔开的,所以我这里使用split('&'),将解码后的字符串通过&符号分割成数组,循环数组得到键名和键值,代码如下(扫普通链接二维码打开小程序 | 微信开放文档 (qq.com))

  1. 生成、获取二维码代码

onLoad: function(options) {
    if (options.scene) { //二维码进入
                const scene1 = decodeURIComponent(options.scene);
                let a = scene1.toString().split('&');
                let obj = {}
                for (let i = 0; i < a.length; i++) {
                    // 获取=前
                    let index = a[i].indexOf("=")
                    let name = a[i].substring(0, index);//键名
                    // 获取=后
                    let index1 = a[i].indexOf("=")
                    let value = a[i].substring(index1 + 1, a[i].length);
                    obj[name] = value //键值
                }
                this.goodsId = obj.id //获取商品id
                this.getType = obj.type; //获取进入页面的方式
       } else{//非二维码进入

       }
}
//生成二维码向后端传递的参数
let data = {
      page: 'page_my/pages/chengbei-goods-details/index',//路径
     scene: `id=${that.goodsId}&code=${that.userCode}&type=${that.getType}`, //参数
}
UniApp 开发的微信小程序实现生成并分享海报的功能,通常包括以下几个关键步骤:绘制画布、加载图片资源、生成海报图像,并最终允许用户进行分享。 ### 绘制画布 首先需要使用 `<canvas>` 元素来创建一个画布。在 Vue 的 `data` 函数中定义画布的宽度和高度: ```javascript data() { return { canvasW: 375, // 设备宽 canvasH: 667, // 设备高 img: "1654073743713419267", mainPic: this.$api.viewFile + '1654305599822200833', erPic: this.$api.viewFile + '20230518001', imagePath: '', // 显示生成的图片 } } ``` 然后,在模板中添加一个 `<canvas>` 元素: ```html <canvas :style="{width: canvasW + 'px', height: canvasH + 'px'}" canvas-id="myCanvas"></canvas> ``` ### 加载图片资源 为了将网络图片绘制到画布上,需要先将其下载到本地,并获取其临时路径。可以使用 `uni.getImageInfo` 或 `uni.downloadFile` 方法来完成这一操作: ```javascript uni.getImageInfo({ src: 'https://example.com/path/to/image.jpg', success: function(image) { console.log('图片宽度:', image.width); console.log('图片高度:', image.height); // 使用 image.path 路径绘制图片到 canvas 上 } }); ``` ### 绘制图片到画布 一旦获得了图片的本地路径,就可以使用 `uni.createCanvasContext` 创建一个画布上下文对象,并使用它来绘制图片: ```javascript const ctx = uni.createCanvasContext('myCanvas'); ctx.drawImage(imagePath, 0, 0, canvasW, canvasH); ctx.draw(); ``` ### 生成海报图像 绘制完成后,可以通过调用 `uni.canvasToTempFilePath` 将画布内容转换为临时文件路径,这个路径可以用来预览或分享图片: ```javascript uni.canvasToTempFilePath({ canvasId: 'myCanvas', success: function(res) { console.log('生成图片成功:', res.tempFilePath); // 可以在这里设置 data 中的 imagePath 来显示图片 } }); ``` ### 分享海报 最后,当用户点击分享按钮时,可以触发 `onShareAppMessage` 事件处理器,该处理器返回的对象决定了分享的内容: ```javascript onShareAppMessage() { return { title: '分享我的海报', path: '/pages/index/index?query=1', imageUrl: this.imagePath // 使用之前生成的图片路径 }; } ``` 通过以上步骤,可以在 UniApp 开发的微信小程序实现生成并分享海报的功能。需要注意的是,在实际开发过程中可能还需要处理更多细节,比如错误处理、不同设备分辨率适配等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值