保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码

news/2024/12/12 12:07:59/

一、获取二维码

      uni.request({url: `https://api.weixin.qq.com/wxa/getwxacode?access_token=${getStorage("token")}`,responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint8Array 类型的数组const arrayBuffer = new Uint8Array(res.data)// 转换为 Base64 编码的字符串const base64 = uni.arrayBufferToBase64(arrayBuffer)// 缓存至本地state.image = base64},fail(err) {console.log(err, "err")}})

代码仅作示例

以上代码作用就是,拿到后端给的base64格式的图片,用做绘图

二、绘制画布

    const handleCanvas = () => {//初始化画布const ctx = uni.createCanvasContext('myCanvas');ctx.setFillStyle("rgba(96, 216, 254, 1)")ctx.fillRect(0, 0, uni.upx2px(750), uni.upx2px(1120))//外边框const mx = uni.upx2px(55)const my = uni.upx2px(332);const mwidth = uni.upx2px(640);const mheight = uni.upx2px(640);const mradius = uni.upx2px(32);const mColor = "#DFF3FF"_border(ctx, mx, my, mwidth, mheight, mradius, mColor)// 内边框const px = uni.upx2px(105)const py = uni.upx2px(382);const pwidth = uni.upx2px(540);const pheight = uni.upx2px(540);const pradius = uni.upx2px(32);const pColor = "#FFF"_border(ctx, px, py, pwidth, pheight, pradius, pColor)//二维码  _QRCode(ctx, state.image)// 绘制画布ctx.draw()}// 绘制边框   参数分别为  画布对象 画布x轴起点 画布y轴起点 画布宽度 画布高度 圆角边框 背景色const _border = (ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, color: string) => {ctx.beginPath();ctx.moveTo(x + radius, y);ctx.lineTo(x + width - radius, y);ctx.arcTo(x + width, y, x + width, y + radius, radius);ctx.lineTo(x + width, y + height - radius);ctx.arcTo(x + width, y + height, x + width - radius, y + height, radius);ctx.lineTo(x + radius, y + height);ctx.arcTo(x, y + height, x, y + height - radius, radius);ctx.lineTo(x, y + radius);ctx.arcTo(x, y, x + radius, y, radius);ctx.closePath();ctx.fillStyle = color;ctx.fill();}const _QRCode = (ctx, data) => {// 获取文件管理器const fsm = wx.getFileSystemManager();//  将 base64 字符串转成 ArrayBuffer对象const buffer = wx.base64ToArrayBuffer(data);// 文件系统中的用户目录路径 (本地路径)const fileName = wx.env.USER_DATA_PATH + '/share_img.png';fsm.writeFileSync(fileName, buffer, 'binary'); // 写入文件, 同步方法// 以上四行代码让其在真机上正常显示,因为canvas无法读取base64格式,需要先保存在文件管理器,拿到临时路径ctx.drawImage(fileName, uni.upx2px(135), uni.upx2px(412), uni.upx2px(480), uni.upx2px(480))}

1.复杂样式尽量使用图片引入 ctx.drawImage("换成你本地图片的相对路径",...)

2.需要其他样式或者图片,自行添加,我这个应该还有个背景图的,在等UI出图

3.画布绘制的顺序需要注意下,后面覆盖的图形会把前面的图形在视觉上覆盖掉,所以二维码方法要写在最后面

三、保存至相册

    const handleSave = () => {uni.showLoading({title: '正在生成海报',mask: true})uni.canvasToTempFilePath({canvasId: 'myCanvas',success: (res) => {uni.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: (res) => {uni.showToast({title: '保存成功',icon: 'none'})}})},complete(result) {uni.hideLoading()},})}


http://www.ppmy.cn/news/1554491.html

相关文章

《人工智能安全:挑战与破局之路》

《人工智能安全:挑战与破局之路》 一、人工智能安全现状二、人工智能安全面临的挑战(一)技术层面的挑战(二)伦理与社会层面的挑战 四、人工智能安全未来发展趋势(一)技术创新引领发展&#xff0…

【Redis源码】网络模型

Redis源码解析网络模型 基于Redis7源码的网络模型解析 前置准备 源码地址:https://github.com/redis/redis Ide:Clion 网络模型 流程节点下方是源码中对应的方法 总结点 Redis 的网络是IO多路复用指令还是单线程串行 扩展的线程池,协助主…

需求场景:查询条件多选时,列表单列实时值分接口获取

文章目录 一、所有条件组合成列表数据(Demo)二、后台进行有效数据快速筛选(Demo) 查询条件多选时,条件为或的关系,那么最终条数为:条件1 * 条件2;如果一起查询时接口统一返回这些数据…

Spring Boot集成Knife4j文档工具

Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单,只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包,OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本,底层依赖框架为Springfox。 此次在4…

阿里云通义千问:全面解析智能云服务先锋

一、技术架构与基础 模型构建基石 采用大规模语料库训练,涵盖多领域知识,如科学、历史、文学等,确保知识储备丰富多样。运用先进的神经网络架构,深度优化模型结构,提高信息处理效率与准确性。持续的语料更新机制&…

基于微信的追星小程序+ssm

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,追星小程序被用户普遍使用,为方便用户能够可以…

设计模式从入门到精通之(一)工厂模式

工厂模式:为每个工厂找到"生意经" 在现实生活中,我们随处可见"工厂"的影子,比如汽车工厂生产汽车,食品工厂生产食品。但你有没有想过,为什么我们需要工厂?如果没有工厂,我们…

实习记录小程序+ssm

摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…