uni-app,关于 canvas 在 app,小程序, h5中,实现绘制,保存本地图片

这篇具有很好参考价值的文章主要介绍了uni-app,关于 canvas 在 app,小程序, h5中,实现绘制,保存本地图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

没有套路,没有难读的文档,直接看代码

html部分

<template>
	<!-- #ifdef MP-WEIXIN -->
		<!-- 定义小程序元素,设置宽高自行设置, type 和 id -->
		<canvas type="2d" id="myCanvas" />
	<!-- #endif -->
	
	<!-- #ifdef APP-PLUS || H5 -->
		<!-- 定义 app 和 h5 元素, 设置宽高自行设置, canvas-id 和 id -->
		<canvas canvas-id="myCanvas" id="myCanvas"></canvas>
	<!-- #endif -->
	
	<button @click="drawCanvas">绘制canvas</button>
	<button @click="preservation">保存到本地</button>
</template>

js部分文章来源地址https://www.toymoban.com/news/detail-649326.html

<script>
	export default {
		data() {
			return {
				textCanvas: null,		// 初始化 canvas 值
			}
		},
		methods: {
			// 绘制canvas
			drawCanvas() {
				// 指定this的指向
				let that = this;
				// uni-app 中,不管是小程序,app,h5 在获取元素实例时,都是统一的方法,只要获取元素的宽高
				uni.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true })
				.exec((res) => {
					// #ifdef MP-WEIXIN
						// 获取设备设备像素比
						const dpr = uni.getSystemInfoSync().pixelRatio;
						// 微信小程序绘制
						let textCanvas = that.textCanvas = res[0].node;			// 获取元素实例
						textCanvas.width = res[0].width * dpr;					// 设置canvas像素宽
						textCanvas.height = res[0].height * dpr;				// 设置canvas像素高
						let textCtx = textCanvas.getContext('2d');				// 创建二维绘图
						textCtx.clearRect(0, 0, res[0].width, res[0].height);	// 设置画布大小
						textCtx.beginPath();									// 创建一条新的路劲
						textCtx.scale(dpr, dpr);								// 设置x,y缩放(这里作用不大,,没效果)
						
						// 这里开始绘制canvas内容,绘制的过程当中,不知道是小程序的问题,还是什么问题在绘制有背景图片的内容时,
						// 文字内容必须要延迟绘制,也就是要定时器延迟一定时间才能绘制,要不然就会将文字覆盖在图片下方。
						// 图片的绘制
						const tx = textCanvas.createImage();
						tx.src = "../../..";									// 线上地址或者本地地址都可以
						tx.onload = () => {
							textCtx.drawImage(tx, 20, 20, 100, 100);			// 参数从左到右说明, 图片文件,x轴开始位置,y轴开始位置,x轴结束位置,y轴结束位置
						};
						// 文字设置
						textCtx.fillStyle = "#3085FC";							// 文字颜色
						textCtx.font = "14px sans-serif";						// 字体样式 设置加粗("normal bold 16px sans-serif");
						textCtx.fillText("内容", 160, 45);				        // 设置文字内容, x轴位置,y轴位置

						// 设置分割线
						textCtx.moveTo(10, 130);								// 设置线条开始位置x,y
						textCtx.lineTo(res[0].width - 10, 130);					// 设置线条结束位置x,y
						textCtx.lineWidth = 1;									// 设置线条粗细
						textCtx.strokeStyle = "#e7e7e7";						// 设置线条颜色
						textCtx.stroke();										// 重点,不写线条不显示
						// ... // 其他设置自己查文档很简单
					// #endif
					// #ifdef APP-PLUS || H5
						// app 和 h5 的设置方式是一样的
						let tcx = uni.createCanvasContext('myCanvas');			// 通过canvasId 创建画布
						// 设置图片,如果是背景图,就通过获取的实例,获取到他的宽高直接使用
						tcx.drawImage('../../../static/imgage/abc.png', 0, 0, res[0].width, res[0].height);
						// 文字和分割线设置和小程序无异
						tcx.draw();												// 将设置的内容绘制出来,不写不显示
					// #endif
				})
			},
			// 保存canvas 到本地
			preservation() {
				// 指定 this 指向
				let that = this;
				// #ifdef MP-WEIXIN
					// 在微信中保存canvas为图片到本地,要通过canvas 实例的参数进行设置
					wx.canvasToTempFilePath({
						x: 0,
						y: 0,
						width: that.textCanvas.width,							// 设置画布宽度
						height: that.textCanvas.height,							// 设置画布高度
						destWidth: that.textCanvas.width,						// 屏幕width像素密度设置
						destHeight: that.textCanvas.height,						// 屏幕height像素密度设置
						canvas:  that.textCanvas,								// 这里是重点,获取实例的时候保存为全局变量就行了
						complete(res) {
							// res.tempFilePath 返回的是临时地址 png 或者 jpg
							wx.saveImageToPhotosAlbum({
								filePath: res.tempFilePath,
								success() {
									uni.showToast({
										title: "保存成功",
										icon: "success"
									})
								},
								fail() {
									uni.showToast({
										title: "保存失败",
										icon: "error"
									})
								}
							});
						}
					})
				// #endif
				// #ifdef APP-PLUS || H5
					// app 和 h5 获取元素的方式都相同
					uni.canvasToTempFilePath({
						canvasId: "myCanvas",
						complete(res) {
							// #ifdef APP-PLUS
								// 在 app 中, 图片地址直接返回的值 临时地址  png 或 jpg,直接使用uni的方法
								uni.saveImageToPhotosAlbum({
									filePath: res.tempFilePath,
									success() {
										uni.showToast({
											title: "保存成功",
											icon: "success"
										});
									},
									fail() {
										uni.showToast({
											title: "保存失败",
											icon: "error"
										})
									}
								})
							// #endif
							// #ifdef H5
								// 在 h5 中,res.tempFilePath 返回的是 base64 类型要处理,通过 a 标签的形式下载
								var arr = res.tempFilePath.split(',');
								var bytes = atob(arr[1]);
								let ab = new ArrayBuffer(bytes.length);
								let ia = new Uint8Array(ab);
								for (let i = 0; i < bytes.length; i++) {
									ia[i] = bytes.charCodeAt(i);
								}
								var blob = new Blob([ab], { type: 'application/octet-stream' });
								var url = URL.createObjectURL(blob);
								var a = document.createElement('a');
								a.href = url;
								a.download = new Date().valueOf() + ".png";
								var e = document.createEvent('MouseEvents');
								e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
								a.dispatchEvent(e);
								URL.revokeObjectURL(url);							
							// #endif
						}
					})
			}
		}
	}
</script>

到了这里,关于uni-app,关于 canvas 在 app,小程序, h5中,实现绘制,保存本地图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序canvas实现简易手写签名版(uni-app)

    微信小程序可以通过canvas实现手写签名的效果,本文中使用的是微信小程序Canvas 2D接口 本示例中绘制的是横屏签名的效果,效果图如下: 这里我们需要调整canvas的物理宽高,默认物理宽高为300*150px,物理宽高调整通过css样式即可,本文中需要根据屏幕高度进行动态调整,使

    2024年02月12日
    浏览(68)
  • uni-app 微信小程序中如何通过 canvas 画布实现电子签名?

    一、实际应用场景 电子签名软件应用场景:电子签名在金融、银行、贷款行业中可以用于对内日常办公流转的文档的盖章签字,对外涉及业务合作协议,采购合同,贷款申请、信用评估、贷款合同、贷款文件表、说明函等等。 可以说,只要是涉及纸质文档签字盖章的场景,

    2024年02月10日
    浏览(57)
  • uni-app | 小程序嵌入H5页面实现支付功能

    前一阵在做公司小程序时,有个需要对接支付的功能。但是本着订单数据和支付统一入口的设计原则,计划是对接公司商城现有的支付体系。故本方案是分析对接商城支付几种可行方案以及每种方案的可行性,最后综合选出一种最佳的方案。 实现方式 跳转商城小程序支付 跳

    2024年02月07日
    浏览(70)
  • uni-app实现 app 小程序 手机端H5扫码功能

    首先 扫码这个功能小程序和App都是有现成的方法 但是H5是不行的 我们可以看这样一段代码 这里 我们用了条件编译 App和小程序中的代码是 一样的 他们都可以正常执行scanCode进行扫码 至于H5手机端界面 我用web-view套了个百度的链接进来 其实 大家可以参考我的文章 vue实现二维

    2024年02月11日
    浏览(63)
  • uni-app实现自定义导航栏,兼容H5、App、微信小程序

    很多情况下,系统自带的导航栏无法满足UI设计的要求,这时候就需要我们自定义导航栏来实现需求,要考虑跨端的多种情况,这里我们封装成一个组件来使用,实现效果如下: 一、H5、App、微信小程序的区别 1.H5:导航栏高度可以设为44px,它没有状态栏,因为H5端运行在浏览

    2024年04月13日
    浏览(76)
  • uni-app之微信小程序实现‘下载+保存至本地+预览’功能

    目录 一、H5如何实现下载功能 二、微信小程序实现下载资源功能方面与H5有很大的不同 三、 微信小程序实现文件(doc,pdf等格式,非图片)下载(下载-保存-预览)功能 四、图片预览、保存、转发、收藏:uni.previewImage() 五、 我当前遇到‘关于文件预览uni.openDocument()’API的问

    2024年02月15日
    浏览(66)
  • uni-app 实现navigateBack返回修改前一页面数据(H5、APP、小程序)

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Web前端全套学习资料》,

    2024年04月29日
    浏览(69)
  • uni-app移动端-H5-微信小程序下载保存图片,文档和视频到手机,带进度条

    可移步插件地址,可直接导入hbuilderx示例项目查看: uni-app移动端-H5-微信小程序下载保存图片,文档和视频到手机,带进度条 具体代码如下

    2024年02月13日
    浏览(40)
  • uni-app微信小程序-利用canvas给图片添加水印

    选择图片 → 将图片绘制到 canvas 中并绘制水印 →将添加水印的图片绘制到 canvas 中 → 将 canvas 画布转换为图片地址 → 上传/展示操作 注意:微信小程序在选择照片或者唤起相机之前需要获取相应的 权限 利用 uni.getSetting 查看用户是否调用相机的权限(有就选择图片,没有就

    2024年02月06日
    浏览(59)
  • uni-app如何区分 app、h5、小程序代码; uni-app如何判断是android、ios、小程序

    uniapp是DCloud公司于2012年开始研发的能够一次代码开发,生成H5、小程序(微信、支付宝、百度、华为等)、APP等应用的技术的统称,开发工具是HBuilderX,功能非常强大,由此引申出许多技术社区与生态环境。 使用HBuilderX开发Uniapp程序的项目,用它生成多端应用,由于兼容各种

    2024年02月11日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包