uni-app用canvas截屏并且分享好友

最近做一个app,需要截取页面保存为图片,然后分享给好友。
uni-app官网https://uniapp.dcloud.io/
那么进入正题
首先是页面的ui图在这里插入图片描述
需要的白色区域截图并且保存图片发给好友。
那么就要用到canvas进行画图,图片的话可以使用drawImage设置背景图
第一步,创建画布

<template>
	<view>
		<canvas class="can" canvas-id="firstCanvas" ></canvas>
	</view>
</template>
<script>
	export default{
		onLoad() {
			var that = this
			that.toDrawCanvas()
		}	,
		methods:{
			//绘制canvas
			toDrawCanvas() {
				let that=this
				let ctx = uni.createCanvasContext('firstCanvas',this)//后来又做了一个分享的项目,发现不加this就不能用
				//uni.upx2px()是尺寸单位转换方法,622为rpx单位,换成px为311,根据设计稿来编辑
				let canvaWidth=uni.upx2px(622)	
				let canvaHight=uni.upx2px(984)
				//绘制文字居中对齐使用,根据我的理解,这个数值是要为需要截图区域宽度的一半
				let centerCode=uni.upx2px(311)	
				let xx=uni.upx2px(64)
				let yy=uni.upx2px(48)
				let font=uni.upx2px(32)//字体大小
				let yzmtop=uni.upx2px(130)
				let yzmleft=uni.upx2px(232)
				let imgurl='../../static/img/my/yqm.png'//设置背景图的路径
				ctx.drawImage(imgurl,0,0,canvaWidth,canvaHight)
				//绘制您的邀请码文字
				ctx.setFillStyle('#333333')//文字颜色
				ctx.setFontSize(font)
				ctx.textAlign="center"//居中,而且这个需要放在ctx.setFontSize()后面,其他api就没去一一使用过
				//绘制文字ctx.fillText(需要绘制的文字,x轴距离,y轴距离);
				ctx.fillText("您的邀请码",centerCode,yzmtop);
				//绘制邀请码文字
				let yqmwenzix=uni.upx2px(311)
				let yqmwenziy=uni.upx2px(227)
				let yamcodes=“邀请码”//这个是放邀请码
				ctx.setFillStyle('#fff')
				ctx.setFontSize(font)
				ctx.textAlign="center"
				ctx.fillText(yamcodes,yqmwenzix,yqmwenziy);
				//绘制复制邀请码
				let copyMx=uni.upx2px(310)
				let copyFont=uni.upx2px(28)
				ctx.setFillStyle('#EEB826')
				ctx.setFontSize(copyFont)
				ctx.textAlign="center"
				ctx.fillText("复制邀请码",yqmwenzix,copyMx);
				//绘制二维码位置
				let erweimaimg='../../static/img/my/appload.png'
				let towCodeX=uni.upx2px(172)
				let towCodeY=uni.upx2px(436)
				let towCodeW=uni.upx2px(280)
				ctx.drawImage(erweimaimg,towCodeX,towCodeY,towCodeW,towCodeW)
				//绘制扫码下载APP文字
				let apploady=uni.upx2px(790)
				ctx.setFillStyle('#333333')
				ctx.setFontSize(font)
				ctx.textAlign="center"
				ctx.fillText("扫码下载APP",yqmwenzix,apploady);
				//绘制分享好友文字
				let shareY=uni.upx2px(890)
				ctx.setFillStyle('#FFFFFF')
				ctx.setFontSize(font)
				ctx.textAlign="center"
				ctx.fillText("分享好友",yqmwenzix,shareY);
				ctx.draw()//结束绘画
			}
		}
	}
</script>

这样到这边,ui图就实现出来了。
第二步,把当前画布指定区域的内容导出生成指定大小的图片,并且分享好友
在此说一个api问题,如果在浏览器调试,并且报错API share is not yet implemented,这个是说改share(uni-app的分享api)在浏览器(h5)不能使用,需要在模拟器上或者真机上使用
ps:saveImageToPhotosAlbum要在小程序后台->设置配置隐私协议,说明保存图片是用来干吗的

export default{
	methods:{
		//绘制canvas
		toDrawCanvas() {.......},
		//分享点击
		appShare() {
			let that = this
			uni.canvasToTempFilePath({
				canvasId: 'firstCanvas',
				success: (res) => {
					//返回文件路径
					that.imageUrl=res.tempFilePath
					//保存图片到系统相册
					uni.saveImageToPhotosAlbum({
							filePath: res.tempFilePath,
							success: (res) => {
								uni.showToast({
									title: '保存成功'
								})
							},
							fail() {
								uni.showToast({
									icon: 'none',
									title: '保存名片码失败'
								})
							}
						})
					//unii-app分享,我在这里是微信分享好友
					uni.share({
						    provider: "weixin",
						    scene: "WXSceneSession",
						    type: 2,
						    imageUrl: res.tempFilePath,
						    success: function (res) {
								console.log(res);
						    },
						    fail: function (err) {
						        console.log("fail:" + JSON.stringify(err));
						    }
						});
				}
			})
		}
	}
}

到此就结束了。
关于分享好友这个点击事件,用canvas绘画出来没有点击事件,只能自己在position: fixed;定位到相对的位置。

OK,准备下班。

最后,如果我的笔记对您有帮助,请给我一个赞~ 谢谢!

### 实现 Uni-app 中的截屏功能 在 Uni-app 开发环境中,可以利用 `canvas` 组件来实现截屏效果。通过绘制页面内容至 canvas 上再将其转换成图片形式保存下来完成截图操作[^1]。 对于更便捷的方式,则可借助第三方插件如 `uView` 或者其他专门用于屏幕捕捉的小型库。这些工具通常提供了更加简洁易用的方法来进行界面抓取工作并支持多种平台适配特性。 下面是一个基于 Canvas 的简单示例代码: ```javascript // 在 Vue 页面中的 methods 定义如下方法 methods: { captureScreen() { const query = uni.createSelectorQuery().in(this); let ctx, tempCanvas; // 获取要截图区域的信息 query.select('#screenshotArea').boundingClientRect(data => { if (!data) return console.error('未找到指定节点'); // 创建临时画布对象 tempCanvas = document.createElementNS("http://www.w3.org/2000/svg", "svg"); Object.assign(tempCanvas, { width: data.width, height: data.height }); // 使用 wx.drawTempFilePath 接口将 canvas 转换成图片文件路径 (仅限于微信环境) try { ctx = tempCanvas.getContext('2d'); // 这里假设有一个 img 元素作为背景图源 const bgImage = new Image(); bgImage.src = 'path_to_background_image'; bgImage.onload = () => { ctx.drawImage(bgImage, 0, 0, data.width, data.height); // 如果是在微信环境下则调用微信 API 来获取图像路径 #ifdef MP-WEIXIN wx.canvasToTempFilePath({ x: 0, y: 0, width: data.width, height: data.height, destWidth: data.width * 2, destHeight: data.height * 2, canvasId: 'myCanvas', success(res) { console.log(`成功获得临时文件路径:${res.tempFilePath}`); } }); #endif // 对于 H5 平台可以直接导出 base64 编码字符串表示的 image/png 数据 URL #ifndef APP-PLUS var pngDataUrl = tempCanvas.toDataURL("image/png"); console.log(pngDataUrl); #endif }; } catch (e) { console.warn(e.message || e); } }).exec(); } } ``` 需要注意的是,在不同平台上可能需要调整具体的实现细节以适应各自的特点和限制条件。上述例子主要展示了如何在一个混合应用框架内使用原生 JavaScript 和特定平台提供的接口相结合的方式来达成目标。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值