uni-app 开发微信小程序 海报分享 canvas画base64编码的图片,开发者工具能展示手机端不能展示处理

教你在canvas上绘制Base64格式的图片 现象描述 当前canvas组件只支持绘制本地图片和网络图片,暂不支持绘制Base64字符串表示的图片格式,下面介绍如何采取规避措施实现。 问题分析 当前image组件支持Base64字符串表示的图片格式,如下所示: 因此可以考虑通过image组件来表示Base64字符串表示的图片,然后用canvas组件绘制image元素来间接实现绘制Base64字符串表示的图片格式。 解决方法 代码如下: 复制 1 2 3 4 5 6 7 阅读详情

微信小程序海报分享

  1. 先从实现一个canvas绘制一张简单的图到可以保存到相册

上代码可以直接复制

<template>
	<view class="posterBg">
		<canvas canvas-id="poster" id="poster" class="poster-box"></canvas>
		<u-popup v-model="show" mode="center">
			<image :src="posterImg" class="posterImg"></image>
		</u-popup>
		<view class="button" @click="saveposter">保存到相册</view>
	</view>
</template>

<script>
export default {
	data() {
		return {
			_w:0,
			bgImgUrl: 'https://yuanzai-zhjk.oss-accelerate.aliyuncs.com/health/uploads/20231129/e9e0eedfb12ff4da5af5d13125510d83.png', //海报背景
			show: false,
			posterImg: '',
		};
	},
	async onReady() {
		this.getSystemInfo(); //获取屏幕宽度适配比例
	},
	onLoad: function(option) {
	},
	onShow() {
	
	},
	mounted() {
		this.showposter();
	},
	methods: {
		//将canvas转图片
		async showposter() {
			uni.showLoading({
				title: '海报生成中...'
			});
			//  绘制海报所需数据    如果是本地图片使用this.getImageInfoUrl
			let bgImgUrl = await this.createImgUrl(this.bgImgUrl);
			this.posterCanvas({
				bgImgUrl
			});
		},
		//保存图片
		saveposter() {
			const that = this;
			uni.getImageInfo({
				src: this.posterImg,
				success: res => {
					console.log('res', res.path);
					uni.saveImageToPhotosAlbum({
						filePath: res.path,
						success: function() {
							uni.showToast({
								title: '保存成功'
							});
						},
						fail: function(err) {
							console.log('err1', err);
						}
					});
				},
				fail: err => {
					console.log('errr', err);
				}
			});
		},
		// 绘制海报
		posterCanvas({ bgImgUrl = ''}) {
			let that = this;
			let ctx = uni.createCanvasContext('poster', this);
			//背景图
			ctx.drawImage(bgImgUrl, 0, 0, this.calculate(310), this.calculate(500));
			ctx.restore();
			ctx.draw();
			// 海报绘制完成
			// 转换成图片
			setTimeout(() => {
				uni.canvasToTempFilePath({
					x: 0,
					y: 0,
					width: that.calculate(310),
					height: that.calculate(494.5),
					// destWidth: this.calculate(930),
					// destHeight: this.calculate(1483.5),
					quality: 1,
					canvasId: 'poster',
					success: res => {
						// console.log(res.tempFilePath, '生成图片');
						that.posterImg = res.tempFilePath;

						uni.hideLoading();

						that.show = true;
					},
					fail: err => {
						// console.log('err', err);
						uni.showToast({
							title: '生成失败',
							icon: 'none'
						});
						uni.hideLoading();
					}
				});
			}, 1000);
		},

		// 获取系统适配
		getSystemInfo() {
			let _this = this;
			uni.getSystemInfo({
				success(res) {
					_this._w = res.windowWidth;
				}
			});
		},
		// 画布计算比例
		calculate(num) {
			let w = this._w;
			let n = parseInt((w * num) / 375);
			return n;
		},
		// 创建本地地址
		createImgUrl: url =>
			new Promise((resolve, reject) => {
				// console.log(url)
				uni.downloadFile({
					url,
					success: val => {
						// console.log('创建本地地址',val)
						resolve(val.tempFilePath)
					},
					fail: err => {
						// console.log('e', err);
						uni.showToast({
							title: '图片出现错误',
							icon: 'none'
						});
						reject(err);
					}
				});
			}),
		// 本地资源路径
		getImageInfoUrl: url =>
			new Promise((resolve, reject) => {
				uni.getImageInfo({
					src: url,
					success: val => resolve(val.path),
					fail: err => {
						// console.log('e', err);
						reject(err);
					}
				});
			}),
	}
};
</script>

<style lang="scss" scoped>
.posterBg{
	text-align: center;
	padding-top: 40rpx;
}
.poster-box {
	width: 620rpx;
	height: 989rpx;
	position: fixed;
	left: 110vw;
	top: 0rpx;
	z-index: -1;
}

.posterImg {
	width: 620rpx;
	height: 989rpx;
	border-radius: 20rpx;
	box-shadow: 0px 5px 10px #888888;
}

.button {
	width: 400rpx;
	height: 88rpx;
	line-height: 88rpx;
	margin: 0 auto;
	text-align: center;
	font-size: 30rpx;
	font-family: PingFang SC;
	font-weight: 500;
	color: #262a32;
	background: #ffffff;
	border-radius: 16rpx;
	margin-top: 48rpx;
	background: #1887FB;
	color: #fff;
	border-radius: 10rpx 10rpx 10rpx 10rpx;
}
</style>


效果

在这里插入图片描述

场景 做一个分享海报 海报上需要又个人的分享码,分享码带个人的id

  1. 之前写过如何生成自己的带id的分享码(如何生成自己的小程序二维码)
    现在需要做的是把一张图片和分享码组成一张海报,可以保存到相册。
  2. 遇到的问题 犹豫生成的二维码是base64编码,而在微信开发工具中使,是可以展示在画布上的,可是到了手机端调试时,发现base64是不能展示在画布上的
<canvas canvas-id="poster" id="poster" class="poster-box"></canvas>

let ctx = uni.createCanvasContext('poster', this);
ctx.drawImage(base64,0,0); // 在微信开发者工具里 是可以看到图片出来的  但是手机上不行

这时候就需要先把base64编码临时存储并生成一个临时的路径url,再用临时的路径去渲染图片

前端图片转base64,并使用canvas对图片进行压缩 图片转base64通常用在用户上传图片的情况下使用,他的作用就是让用户看到预览的图片不受网络的影响。:首先是用户选择图片上传至服务器,服务器保存接收返回一个url地址,然后客户端带着这个url地址再去请求图片,最后才拿到用户上传的图片预览,这个过程如果是网络不好的情况,很影响用户的体验。在上传的时候不需要依赖服务器的请求,直接在客户端就进行转换,利用的是文件IO读取,这个不受网络IO的影响,并且比网络要快的多并且如果有编辑图片的需求,是不是又得重新进行一次第一步的步骤,如果网络不好,非常的影响用户的体验。 阅读详情

相关推荐

避坑指南:uniapp中base64转图片的3种方法对比(canvas/直接展示/文件存储)

本文对比了uni-app中将Base64字符串转换为图片的三种核心方法:Canvas绘制、直接展示(Data URL)和文件存储。文章深入分析了各方法的性能、内存管理及平台兼容性,重点指出文件存储方案(利用uni.getFileSystemManager API)是处理大图、规避小程序长度限制的稳定生产级方案,并提供了实战选型指南与优化策略。

weixin_29007135的博客 109

canvas图片旋转,图片base64编码,保存图片

canvas图片旋转,图片base64编码,保存图片

芝芝为荔枝 4676

【uniapp开发微信小程序】上传图片,图片压缩,图片转base64

【uniapp开发微信小程序】上传图片,图片压缩,图片转base64

前端菜鸟好先森的博客 2328

UNIAPP微信小程序中使用Base64编解码原理分析和算法实现

为何要加上UNIAPP及微信小程序,可能是想让检索的翻围更广把。😇 Base64的JS原生编解码在uni的JS引擎中并不能直接使用,因此需要手写一个原生的Base64编解码器。正好项目中遇到此问题,需要通过URLLink进行小程序跳转并携带Base64参数进行数据传递,从而更好的在跳转后的初始化中进行鉴权等其他操作。特此将Base64的相关内容进行分析。需要具体实现算法的直接跳到最后即可。

YUE 5893

uni-app跨平台视频封面自动提取:H5与APP端兼容实现方案

在视频内容展示场景中,封面图是提升点击率与用户体验的关键。其核心原理是通过解码视频流,获取首帧画面数据,并利用图形绘制技术将其转换为静态图像。这一技术对于UGC平台和内容型应用具有重要价值,能显著降低运营成本并提升内容吸引力。具体实现时,在H5端可基于HTML5的video元素与canvas绘图能力完成;而在APP端则需调用原生API(如plus.video.VideoPlayer)进行视频帧捕获。本文聚焦于uni-app框架下的跨平台开发,详细解析如何通过一套代码兼容H5与APP两端,实现稳定高效的视频封

weixin_30606461的博客 528

Uniapp图片压缩实战:从相册到Base64的完整避坑指南(附H5兼容方案)

本文提供了一份完整的Uniapp图片压缩实战指南,涵盖从相册选择到Base64编码转换的全流程,并重点解决了H5端的兼容性问题。文章深入剖析了官方API在多端平台上的限制,提供了基于Canvas的H5端高质量压缩方案,以及确保Base64转换稳定性的健壮代码,帮助开发者构建跨平台兼容的图片上传功能。

weixin_29009081的博客 304

uni-app图片压缩转base64位 利用递归来实现多张图片压缩

chooseImage(){ let that =this uni.chooseImage({ sizeType: ['original','compressed'], //可以指定是原图还是压缩图,默认二者都有 count: 9,//默认9 success: (rem) => { console.log(rem) that.tempFilePaths = rem.tempFilePaths; //#ifdef MP-WEIXIN .

u010227042的博客 827

前端Canvas与AI生成技术融合:PixVerse Canvas素材创作实践指南

HTML5 Canvas作为Web端强大的图形渲染技术,其核心原理在于通过JavaScript API在网页上动态绘制2D图形与图像。结合当下热门的AI生成技术,如文生图、图生图模型,前端开发者能够构建出智能化的视觉内容创作工具。这种技术融合的价值在于显著降低了动态素材、营销海报等视觉内容的生产门槛,实现了从设计到成品的自动化流程。其典型应用场景包括社交媒体图片批量生成、Web应用内嵌AI绘图功能以及教育类创意工具开发。本文聚焦于如何将Canvas绘图能力与AI服务API(如PixVerse)进行工程化集成

weixin_30824479的博客 366

uniapp中高效处理base64图片:从解码到canvas渲染的完整实践

本文详细介绍了在uniapp中高效处理Base64图片的完整实践,包括解码、文件系统操作和Canvas渲染。通过uni.getFileSystemManager实现Base64转本地文件,解决跨平台路径差异问题,并提供Canvas渲染优化技巧,帮助开发者提升移动应用中的图片处理效率与性能。

nept的博客 77

UniApp跨平台视频封面自动提取:H5与APP端兼容实现方案

在移动应用与Web开发中,视频封面作为用户交互的第一触点,直接影响点击率与用户体验。其技术原理涉及视频解码、帧捕获与图像渲染等核心概念。通过客户端本地提取首帧,开发者能够在不依赖服务器的情况下,实现即时预览与资源优化,这对于提升内容平台的运营效率与用户体验具有重要价值。该技术广泛应用于短视频、内容管理、社交分享等场景,尤其在UniApp这类跨平台框架中,需处理H5与原生APP的环境差异。本文聚焦于UniApp环境下,通过条件编译与原生API桥接,解决视频封面自动提取的兼容性问题,并融入性能优化与异常处理等工

weixin_30595035的博客 432

uni-app微信小程序登录页UI设计:从渐变背景到交互优化的全流程实践

在移动应用开发中,前端UI设计与用户体验优化是提升产品竞争力的关键环节。其核心原理在于通过合理的视觉层次、流畅的交互反馈与稳定的性能表现,构建直观高效的用户界面。对于跨平台开发场景,uni-app框架凭借其“一套代码多端运行”的能力,成为高效开发的重要技术选择。结合微信小程序平台特性,开发者需在遵循其设计规范的同时,解决键盘适配、表单验证、多登录方式集成等具体工程问题。本文聚焦于登录页这一高频场景,详细阐述了如何运用CSS3渐变、毛玻璃效果、动态样式绑定等前端技术,打造一个兼具美观与实用性的登录界面,并深入

weixin_30600197的博客 635

uni-app小程序使用小程序码绑定用户信息合成海报

uni-app小程序使用小程序码绑定用户信息合成海报 需求 uni-app小程序使用小程序码绑定用户信息合成海报,小程序码绑定用户信息,和背景图片生成一张海报并保存到本地。 目标 生成目标图片 并保存 准备工作 1.小程序码(后台请求微信接口生成图片Buffer),我这里叫后台处理生成了base64格式。 微信小程序获取小程序码官方文档 2.背景图片(放在本地项目目录中) 代码实现 1.运用canvas,创建画布,小程序码和背景图片绘制的方法。 <canvas class="page-conte

jiudenggushijingguo的博客 724

Dify工作流实践—根据word需求文档编写测试用例到Excel中

文章介绍了用dify工作流实现从word需求文档到测试用例写入excel的详细落地过程

weixin_42476668的博客 5334

uni-app 微信小程序 保存当前页面为图片

由于在微信小程序环境下面没法获取dom,很多方法都很难去实现保存html结构的页面,比较有效的#painter 可以不需要操作dom,但是那玩意儿和重新用js写个页面一样,简单的页面还好,复杂的,元素比较多的就很麻烦,所以考虑用webview+html2canvas来完成。先说一下思路,既然在微信小程序环境下行不通,那就考虑换个环境,用webview加载页面,再通过html2canvas来生成相应的canvas,然后转成图片。

zsdrhnfjn的博客 7917

UQLab——其他概率分布随机变量转换标准Gaussian分布

1、使用UQLab将其他类型的随机变量转换成标准Gaussian分布; 2、使用科学计数法输出样本,方便后续ANSYS的调用分析; 3、基于MC的可靠度分析。 原随机变量分布类型: % 调用UQLab进行采样 clc clear uqlab %% Specify these distributions as a UQLab INPUT object: PriorOpts.Marginals(1...

ikhui7的博客 3014

从混乱到清晰:用QJsonObject重构你的Qt网络API数据解析层(避坑指南)

本文详细介绍了如何使用QJsonObject重构Qt网络API数据解析层,避免常见的JSON解析陷阱。通过安全解析模式、数据绑定和性能优化技巧,帮助开发者构建高效、健壮的解析逻辑,提升代码可维护性和可读性。特别适用于处理复杂嵌套的JSON响应数据场景。

weixin_29011667的博客 230

小程序Canvas签名图片翻转问题:从原理到解决方案

在移动端开发中,Canvas绘图是处理图形和用户交互的核心技术之一,尤其在实现电子签名、手写板等功能时应用广泛。其原理基于2D渲染上下文,通过坐标系统和像素操作来绘制图形。然而,Canvas的图像数据在内存中的存储方式(通常Y轴向下)与图像编码标准(如JPEG的EXIF方向标签)可能存在差异,这导致了跨平台显示一致性的技术挑战。这种差异在涉及图像导出、编码、解码和再渲染的流程中尤为突出,容易造成图片方向错乱,直接影响用户体验和功能可靠性。其技术价值在于确保用户生成的内容(如签名、绘图)在任何设备和场景下都能

weixin_30552811的博客 371

【遥感物候】植被物候与气候(气温和降水)条件的空间相关性分析

植被生长与气候的关系最为密切,通过计算植被各个生长季参数和气温、降水之间的相关系数可以分析生长季参数的变化与气温、降水之间的关系的程度。本文计算30年的植被物候参数和气候数据之间的相关性,最终效果如下: 一、相关性分析原理 植被生长季及其变化是其生长环境中多个影响因子综合作用的耦合过程,其中气候是最重要、最活跃的环境因子。通过计算各个生长季参数和气温、降水之间的相关系数...

智慧空间实验室 8260

niapp 的 H5和微信小程序上传 base64 图片

2、FileReader 实现图片转 base64。3、使用 canvas 实现图片转 base64。1、uni-h5 将选择图片转 base64。

啊哈的博客 280

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1452

高级技能-高可用和容灾-两地三中心、异地多活架构

两地三中心和异地多活是当前主流的跨地域高可用架构方案。两地三中心通过生产中心、同城灾备和异地灾备的组合,提供多级容灾能力,适合对数据安全要求高的行业。异地多活则采用单元化设计,多个站点同时服务,提升资源利用率,但需解决网络延迟、数据冲突等挑战。两种架构在RTO/RPO、一致性、改造成本等方面各具特点,企业应根据业务规模、一致性要求和预算进行选择,可考虑从同城双活起步,逐步向异地多活演进。混合架构可能是平衡容灾与多活的务实方案。

zhongjianfeng100的博客 169

uni-app多媒体处理:base64与二进制数据转换实践

在移动应用开发中,多媒体文件处理是常见需求,涉及base64编码与二进制数据转换等核心技术。base64编码将二进制数据转换为ASCII字符串,便于在文本协议中传输,但会增大33%体积。二进制数据则保持原始格式,适合直接处理和大文件传输。uni-app框架提供的uni.chooseMedia API能跨平台获取媒体文件,配合uni.getFileSystemManager可实现高效格式转换。这种技术在图片上传、即时预览等场景尤为重要,特别是在需要兼顾微信小程序、H5等多端兼容性的混合开发项目中。通过合理使用

weixin_34332905的博客 386

从零开始学习PX4源码23(飞行模式管理)

本文摘要主要介绍了PX4飞控系统中飞行模式管理模块的代码实现流程。文章从整体架构入手,分析了飞行模式管理模块的启动过程、类继承关系以及核心运行机制。重点阐述了模块从rc.mc_apps启动脚本到FlightModeManager::main()的调用链路,包括任务创建、工作队列初始化和主循环执行流程。核心部分解释了Run()函数如何通过订阅传感器数据、更新参数、处理命令以及生成轨迹设定点来实现飞行模式切换和任务管理功能。文章为理解PX4飞行控制系统的模式切换机制提供了代码层面的详细分析。

陌城烟雨 499

uni-app微信小程序渲染层错误排查:从原理到实战解决方案

在跨端开发领域,数据驱动视图是核心原理,它通过响应式数据绑定与虚拟DOM Diff机制实现高效UI更新。然而,在小程序架构中,逻辑层与渲染层分离的通信机制(如setData)若使用不当,极易引发性能瓶颈与渲染故障,直接影响应用稳定性与用户体验。尤其在处理复杂数据结构、高频数据更新或使用原生组件时,不当的数据传递与资源管理会导致内存泄漏、渲染超时等典型问题。本文聚焦uni-app开发微信小程序时常见的“渲染层错误”,深入剖析其背后成因——涵盖setData性能优化、第三方组件兼容性、WXS数据传递等高频场景,

weixin_30457551的博客 500

026:vue+threeJS 设置地面铺砖的效果

BoxGeometry 是 Three.js 中用于创建立方体或长方体的几何体类。它允许你指定立方体的宽度、高度、深度以及这三个方向上的分段数,从而控制立方体的细分程度。width: 立方体的宽度(沿 x 轴方向)。height: 立方体的高度(沿 y 轴方向)。depth: 立方体的深度(沿 z 轴方向)。widthSegments: 可选参数,指定立方体在 x 轴方向上的分段数,默认值为 1。heightSegments: 可选参数,指定立方体在 y 轴方向上的分段数,默认值为 1。

大剑师兰特的GIS世界 647

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

uni-app 实现图片上传添加水印操作

一、定义一个canvas标签,微信小程序的实现方式有所变动 <!-- #ifdef MP-WEIXIN --> <canvas type="2d" id="upload-canvas" class="uploadCanvas" :style="{'width':width+'px','height':height+'px','position':'absolute','z-index':'-999','left':'-1000000px'}"></canvas>

weixin_40466351的博客 2721

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 微信小程序隐私API调用(如相册,拍照等)需要先同意隐私协议
double_Fly_
博客等级 码龄7年 7327粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值