小程序做自定义分享封面图,Canvas base64图片数据真机上不显示?【已解决】

news2024/11/17 15:58:44

首选说一下需求,做一个小程序分享,但是封面图要自定义,除了要有对应商品还有有背景图,商品名。类似这种

实现逻辑,把商品图和背景图,再加上价格和商品名用canvas 渲染出来

这是弄好之后的效果图,里面的背景色和商品图还有商品名称,价格这些可以自定义

具体实现步骤

1,写一个 canvas标签,写好对应的canvas-id="myCanvas" ,设置宽高

2,这个主要是有图片文字组成,图片渲染到canvas的话我们需要先转成bese64,完成之后在工具上就可以到了,但是这个时候真机是看不到的,需要我们把base64数据通过wx.getFileSystemManager方法写入一下,这样真机就可以访问了

3,写好之后我们就可以写入文字调整对应的位置就可以了

 好了下面开始吧,本来想直接沾全部代码的,后面想想还是一步一步来,只要一步一步调试好,基本不会出问题了,好了,下面开始

1,我们要想做这么图的话,因为是动态的,所以这里的图片我们要用canvas画出来

定义一个canvas标签

<canvas canvas-id="myCanvas" style="width: 508.47rpx; height: 406.78rpx;position: fixed;left: -800px;"></canvas>

注意这里fixed;left: -800px; 在调试阶段可以去掉要不然看不到效果图了 

2,定义好标签后我们就需要给他画出来,首先我们画canvas的话需要用本地图,或者用base64

因为我们商品图都是动态的所以这里只能用base64,我们需要在画图之前先把我们需要渲染的图片改成base64数据

urlTobase64(url) {
				console.log('ruw', url)
				wx.request({
					url: url,
					responseType: 'arraybuffer', //最关键的参数,设置返回的数据格式为arraybuffer
					success: res => {
						//把arraybuffer转成base64
						let base64 = wx.arrayBufferToBase64(res.data);
			
						//不加上这串字符,在页面无法显示的哦
						base64 = 'data:image/jpeg;base64,' + base64
						// this.lineBg = base64
						this.writecommodityImg(base64)
						//打印出base64字符串,可复制到网页校验一下是否是你选择的原图片呢
						// console.log('base64=>', this.lineBg)
						console.log('kais')
			
						const ctx = uni.createCanvasContext('myCanvas', this); // 获取 Canvas 上下文
			
						// 绘制背景图像
						let bg ="data:image/png;base64,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"
					
						
						 this.writebgImg(bg)
						ctx.drawImage(this.canvasImg.bgimgPath, 0, 0, 264, 215);
						// 绘制商品图
						ctx.drawImage(this.canvasImg.commodityimgPath, 20, 22, 90, 100); // 商品图
			
						// 添加商品名称
						ctx.setFontSize(18);
						ctx.setFillStyle('#000000');
						// this.productDetail.proName
						// ctx: 画布的上下文环境
						// content: 需要绘制的文本内容
						// drawX: 绘制文本的x坐标
						// drawY: 绘制文本的y坐标
						// lineHeight:文本之间的行高
						// lineMaxWidth:每行文本的最大宽度
						// lineNum:最多绘制的行数
						// */
						this.textPrewrap(ctx, this.productDetailbox.proName, 115, 40, 25, 115, 2)
						// this.textPrewrap(ctx, '测试风收到回复肯德基福克斯等哈开发手打开发机三打哈登记说法凯撒代发', 115, 40, 25, 115, 2) 
			
			
						// ctx.fillText('测试风收到回复肯德基福克斯等哈开发手打开发机三打哈登记说法凯撒代发', 200,50, 140);
			
						// 添加商品价格
						// ctx.setFontSize(22);
						ctx.setFillStyle('#FF0000');
						// this.productDetail.price
						 ctx.font = 'normal bold 26px Arial,sans-serif '
						ctx.fillText('¥' + this.productDetail.price, 115, 120, 200, 70);
			
						// 绘制完成并导出图片
						ctx.draw(false, () => {
							uni.canvasToTempFilePath({
								canvasId: 'myCanvas',
								success: (res) => {
									console.log(res.tempFilePath); // res.tempFilePath 就是生成的图片路径
									this.tempFilePath=res.tempFilePath
									// this.uploadbgImg(res.tempFilePath)
									// 这里可以将 res.tempFilePath 返回给调用方或者保存到本地
								},
								fail: (res) => {
									console.error(res);
								}
							}, this);
						});
					}
				})
			},

这里的urlTobase64(url) url是你的远程图片路径,通过arrayBufferToBase64他会返回你一个base64数据

//把arraybuffer转成base64
let base64 = wx.arrayBufferToBase64(res.data);

转入成功后我们在把图片渲染到 canvas之前需要把base64写入一下

跟这个一样,你只需要换一下里面的base64数据就行,需要注意的是一个他好像不能循环利用,一个图片你要单独写一个方法进入写入

 写入方法:

	writebgImg(data){
				const base64 = data; //base64格式图片
				const time = new Date().getTime();
				//USER_DATA_PATH:文件系统中的用户目录路径 (本地路径)
				const imgPath = wx.env.USER_DATA_PATH + "/poster" + time + "" + ".png";
				const imageData = base64.replace(/^data:image\/\w+;base64,/, "");
				const file = wx.getFileSystemManager();
				file.writeFileSync(imgPath, imageData, "base64");
				this.canvasImg.bgimgPath=imgPath
				console.log('imgPath',this.canvasImg.bgimgPath);
				//imgPath就是图片在本地的地址
				
				//如需保存至本地
				 // wx.saveImageToPhotosAlbum({
				 //       filePath: imgPath,
				 //        success: (res) => {
				 //            wx.showModal({
				 //                title: '照片已保存至相册',
				 //                content: '快去分享给小伙伴吧',
				 //                confirmText: '我知道了',
				 //                showCancel: false,
				 //           })
				 //       }
				 // })
			},

方法里面什么都不用改,他会正常给你返回一个真机可读取的路径

	// 商品图
			writecommodityImg(data){
				const base64 = data; //base64格式图片
				const time = new Date().getTime();
				//USER_DATA_PATH:文件系统中的用户目录路径 (本地路径)
				const imgPath = wx.env.USER_DATA_PATH + "/poster" + time + "" + ".png";
				const imageData = base64.replace(/^data:image\/\w+;base64,/, "");
				const file = wx.getFileSystemManager();
				file.writeFileSync(imgPath, imageData, "base64");
				this.canvasImg.commodityimgPath=imgPath
				console.log('imgPath',this.canvasImg.commodityimgPath);
				
			},

写入完之后你就可以渲染对应的图片数据了,根据你对应的位置和大小进行修改就可以了

	// 绘制商品图ctx.drawImage(图片渲染路径,x轴位置,y轴位置,宽,高)
	ctx.drawImage(this.canvasImg.commodityimgPath, 20, 22, 90, 100); // 商品图
    

文字也一样

ctx.fillText('¥' + this.productDetail.price, 115, 120, 200, 70);

但是如果文字是商品名称你又想设置换行可以根据我下面这个方法来

this.textPrewrap(ctx, this.productDetailbox.proName, 115, 40, 25, 115, 2)

 我这个方法是在urlTobase64里渲染的时候用到的,就是你在渲染文字的地址换成这个方法就行

     // this.productDetail.proName
                        // ctx: 画布的上下文环境
                        // content: 需要绘制的文本内容
                        // drawX: 绘制文本的x坐标
                        // drawY: 绘制文本的y坐标
                        // lineHeight:文本之间的行高
                        // lineMaxWidth:每行文本的最大宽度
                        // lineNum:最多绘制的行数

下面是对应方法

	textPrewrap(ctx, content, drawX, drawY, lineHeight, lineMaxWidth, lineNum) {
				var drawTxt = ''; // 当前绘制的内容
				var drawLine = 1; // 第几行开始绘制
				var drawIndex = 0; // 当前绘制内容的索引
				// 判断内容是否可以一行绘制完毕
				if (ctx.measureText(content).width <= lineMaxWidth) {
					ctx.fillText(content.substring(drawIndex, i), drawX, drawY);
				} else {
					for (var i = 0; i < content.length; i++) {
						drawTxt += content[i];
						if (ctx.measureText(drawTxt).width >= lineMaxWidth) {
							if (drawLine >= lineNum) {
								ctx.fillText(content.substring(drawIndex, i) + '..', drawX, drawY);
								break;
							} else {
								ctx.fillText(content.substring(drawIndex, i + 1), drawX, drawY);
								drawIndex = i + 1;
								drawLine += 1;
								drawY += lineHeight;
								drawTxt = '';
							}
						} else {
							// 内容绘制完毕,但是剩下的内容宽度不到lineMaxWidth
							if (i === content.length - 1) {
								ctx.fillText(content.substring(drawIndex), drawX, drawY);
							}
						}
					}
				}
			},

 最后绘制并导出就好了

// 绘制完成并导出图片
						ctx.draw(false, () => {
							uni.canvasToTempFilePath({
								canvasId: 'myCanvas',
								success: (res) => {
									console.log(res.tempFilePath); // res.tempFilePath 就是生成的图片路径
									this.tempFilePath=res.tempFilePath
									// this.uploadbgImg(res.tempFilePath)
									// 这里可以将 res.tempFilePath 返回给调用方或者保存到本地
								},
								fail: (res) => {
									console.error(res);
								}
							}, this);
						});

在对应分享页面设置图片就OK了 

onShareAppMessage() {
		
			// console.log(this.tempFilePath)
			return {
				title:'Hi,这个商品不错,分享给你',
				path: '/pages/index/index',
				imageUrl: this.tempFilePath, //背景图
				success: function() {
					uni.showToast({
						title: '分享成功',
						icon: 'success'
					});
				},
				fail: function() {
					uni.showToast({
						title: '分享失败',
						icon: 'none'
					});
				}
			}
		},

 有问题随时滴滴。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode-刷题记录-前缀和合集(本篇blog会持续更新哦~)

一、前缀和&#xff08;Prefix Sum&#xff09;算法概述 前缀和算法通过预先计算数组的累加和&#xff0c;可以在常数时间内回答多个区间和相关的查询问题&#xff0c;是解决子数组和问题中的重要工具。 它的基本思想是通过预先计算和存储数组的前缀和&#xff0c;可以在 O(1)…

NCCL 中的一些辅助debug 知识点

1&#xff0c;调试nccl 启动kernel的方法 ncclLaunchKernel cuLaunchKernelEx ncclStrongStreamLaunchKernel cudaLaunchKernel ncclLaunchOneRank cudaLaunchKernel 在 nccl lib 中&#xff0c;不存在使用<<<grid, block,,>>> 这种类似方式启…

【咨询】企业数字档案馆(室)建设方案-模版范例

导读&#xff1a;本模版来源某国有大型医药行业集团企业数字档案馆&#xff08;室&#xff09;建设方案&#xff08;一期300W、二期250W&#xff09;&#xff0c;本人作为方案的主要参与者&#xff0c;总结其中要点给大家参考。 目录 1、一级提纲总览 2、项目概述 3、总体规…

【零基础】学JS之APIS(基于黑马)

喝下这碗鸡汤 披盔戴甲,一路勇往直前! 1. 什么是事件 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 2. 什么是事件监听? 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 注…

深度学习(笔记内容)

1.国内镜像网站 pip使用清华源镜像源 pip install <库> -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip使用豆瓣的镜像源 pip install <库> -i https://pypi.douban.com/simple/ pip使用中国科技大学的镜像源 pip install <库> -i https://pypi.mirro…

华为eNSP:HCIA汇总实验

本次拓扑实验需求&#xff1a; 1、内网地址用DHCP 2、VLAN10不能访问外网 3、使用静态NAT 实验用到的技术有DHCP、划分VLAN、IP配置、VLAN间的通信&#xff1a;单臂路由、VLANIF&#xff0c;静态NAT、基本ACL DHCP是一种用于自动分配IP地址和其他网络参数的协议。 划分VLA…

Elasticsearch:Node.js ECS 日志记录 - Winston

这是继上一篇文章 “Elasticsearch&#xff1a;Node.js ECS 日志记录 - Pino” 的续篇。我们继续上一篇文章来讲述使用 Winston 包来针对 Node.js 应用生成 ECS 向匹配的日子。此 Node.js 软件包为 winston 记录器提供了格式化程序&#xff0c;与 Elastic Common Schema (ECS) …

Linux系统下的用户管理模式

Linux系统下的用户管理模式 本文以属于Linux系统基本概念&#xff0c;如果以查找教程教程&#xff0c;解决问题为主&#xff0c;只需要查看本文后半部分。 如需要系统性学习请查看本文前半部分。 文章目录 Linux系统下的用户管理模式1. Linux下用户的概念2. 创建不同类型的用户…

前沿重器[53] | 聊聊搜索系统6:精排

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

STM32实战篇:闪灯 × 流水灯 × 蜂鸣器

IO引脚初始化 即开展某项活动之前所做的准备工作&#xff0c;对于一个IO引脚来说&#xff0c;在使用它之前必须要做一些参数配置&#xff08;例如&#xff1a;选择工作模式、速率&#xff09;的工作&#xff08;即IO引脚的初始化&#xff09;。 IO引脚初始化流程 1、使能IO引…

TTS模型汇总

TTS是“Text-to-Speech”的缩写&#xff0c;中文意思是“文本到语音”。这是一种将文本信息转换成口语的技术&#xff0c;通常通过计算机程序实现。TTS技术可以应用于多种场景&#xff0c;包括但不限于&#xff1a; 辅助阅读&#xff1a;帮助视障人士或有阅读困难的用户通过听…

SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION--论文笔记

论文笔记 资料 1.代码地址 https://github.com/google-research/sam https://github.com/davda54/sam 2.论文地址 https://arxiv.org/abs/2010.01412 3.数据集地址 论文摘要的翻译 在当今严重过度参数化的模型中&#xff0c;训练损失的值很难保证模型的泛化能力。事实上…

工业电脑一体机在高清视频处理中的应用

工业电脑一体机在高清视频处理中的应用广泛&#xff0c;尤其是在需要高性能计算、稳定性和实时处理能力的场景中。以下是工业电脑一体机在高清视频处理中的具体应用&#xff1a; 视频监控与分析&#xff1a; 工业电脑一体机能够处理多个高清视频流&#xff0c;实现实时监控&a…

echarts实现3D饼图

先看下最终效果 实现思路 使用echarts-gl的曲面图&#xff08;surface&#xff09;类型 通过parametric绘制曲面参数实现3D效果 代码实现 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

Kafka(三)Producer第二篇

一&#xff0c;生产者架构 生产者客户端由两个线程协调运行&#xff0c;分别为主线程和Sender线程&#xff08;发送线程&#xff09;。 主线程&#xff1a;KafkaProducer创建消息&#xff0c;通过拦截器、序列化器和分区器之后缓存到消息收集器RecordAccumulator中&#xff1b;…

Java面试八股之MySQL如何使用explain优化SQL和索引

MySQL如何使用explain优化SQL和索引 在MySQL中&#xff0c;EXPLAIN是一个非常有用的工具&#xff0c;用于分析和优化SQL查询。它可以帮助你理解查询执行计划&#xff0c;包括如何使用索引、表的连接方式、是否使用了临时表或文件排序等。以下是一些使用EXPLAIN来优化SQL查询和…

VBA经典应用69例应用5:使用VBA拆分窗格

《VBA经典应用69例》&#xff08;版权10178981&#xff09;&#xff0c;是我推出的第九套教程&#xff0c;教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开&#xff0c;这套教程案例众多&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以便…

卷积神经网络可视化的探索

文章目录 训练LeNet模型下载FashionMNIST数据训练保存模型 卷积神经网络可视化加载模型一个测试图像不同层对图像处理的可视化第一个卷积层的处理第二个卷积层的处理 卷积神经网络是利用图像空间结构的一种深度学习网络架构&#xff0c;图像在经过卷积层、激活层、池化层、全连…

防火墙详解(USG6000V)

0、防火墙组网模式 防火墙能够工作在三种模式下分别是路由模式、透明模式、旁路检测模式、混合模式 0.1、路由模式 路由模式&#xff1a;防火墙全部以第三层对外连接&#xff0c;即接口具有IP 地址。一般都用在防火墙是边界的场景下 防火墙需要的部署/配置&#xff1a; 接…

自动连点鼠标器是什么?好用的鼠标连点器分享

你听说过自动鼠标连点器吗&#xff1f;自动连点鼠标器是一种软件工具&#xff0c;用于自动模拟鼠标点击操作。这种工具可以设置为在特定位置和时间间隔内自动点击鼠标&#xff0c;减轻手动点击的负担。自动连点器通常可以在很多生活场景中帮助我们节省时间成本&#xff0c;今天…