关于使用uniapp截图APP内容的两种办法,及一种小程序原生的截图办法

方法一 html2canvas

<template>
	<view>
		<view id="container" class="content">
			<view ref="imageDom" class="card">
				截图内容
			</view>
		</view>
		<view class="buttonArea">
			<view class="buttonItem" @click="canvasToImage.generateImage_Share">
				<image src="../../static/logo_button.png" class="buttonImg"></image>
				<view class="buttonTxt">分享给朋友</view>
			</view>
			<view class="buttonItem" @click="canvasToImage.generateImage">
				<image src="../../static/save_button.png" class="buttonImg"></image>
				<view class="buttonTxt">保存到相册</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				logo: logo(),
				topBackground: topBackground(),
				QrCode: QrCode(),
				data: {
					type: '',
					titleTime: '',
					Slogan: []
				},
				info: {},
				name: uni.getStorageSync('nickname'),
				avatar: uni.getStorageSync('avatar')
			}
		},
		
		mounted() {},
		methods: {

            // 保存图片
			getSaveImg(data) {
				uni.showLoading({
					mask: true
				})
				let base64data = data.base64data;
				// console.log("base64data", base64data)
				// return 
				let bitmap = new plus.nativeObj.Bitmap("test");
				bitmap.loadBase64Data(base64data, function() {
					console.log("加载Base64图片数据成功");
					let time = Date.now()
					let url = '_downloads/yflPic' + time + '.png';
					uni.hideLoading()
					bitmap.save(url, {}, function(i) {
						console.log('保存图片成功:' + JSON.stringify(i));
						// 保存图片到相册
						uni.saveImageToPhotosAlbum({
							filePath: url,
							success: function() {
								uni.showToast({
									title: '图片保存成功',
									icon: 'none'
								})
								// 图片保存成功后,将临时保存的图片删除
								plus.io.resolveLocalFileSystemURL(
									url,
									function(entry) {
										entry.getMetadata(function(metadata) {
											// console.log("fileCount=" + metadata.fileCount);
											entry
												.remove(); //删除单个文件 _downloads/改文件名

										});
									},
									function(error) {
										// uni.showToast({ title: "下载文件" });
										console.log("error" + error);
									}
								);
								bitmap.clear()
							}
						});
						bitmap.clear();
					}, function(e) {
						onsole.log('保存图片失败:' + JSON.stringify(e));
						bitmap.clear();
					});
				}, function() {
					console.log('加载Base64图片数据失败:' + JSON.stringify(e));
					bitmap.clear();
				});
			},

            // 分享图片
			getSaveImg_Share(data) {
				uni.showLoading({
					mask: true
				})
				let base64data = data.base64data;
				let bitmap = new plus.nativeObj.Bitmap("test");
				bitmap.loadBase64Data(base64data, function() {
					console.log("加载Base64图片数据成功");
					let time = Date.now()
					let url = '_downloads/yflPic' + time + '.png';
					uni.hideLoading()
					bitmap.save(url, {}, function(i) {
						console.log('保存图片成功:' + JSON.stringify(i));
						// 转发图片到微信
						uni.share({
							provider: "weixin",
							scene: "WXSceneSession",
							type: 2,
							imageUrl: url,
							success: function(res) {
								console.log("success:" + JSON
									.stringify(res));
								bitmap.clear();
							},
							fail: function(err) {
								console.log("fail:" + JSON.stringify(
									err));
							}
						});

					}, function(e) {
						onsole.log('保存图片失败:' + JSON.stringify(e));
						bitmap.clear();
					});
				}, function() {
					console.log('加载Base64图片数据失败:' + JSON.stringify(e));
					bitmap.clear();
				});
			},
		}
	}
</script>

<script module="canvasToImage" lang="renderjs">
	import html2canvas from 'html2canvas';
	export default {
		data() {
			return {}
		},
		methods: {
			// 获取设备的Dpr值
			getDpr() {
				if (window.devicePixelRatio && window.devicePixelRatio > 1) {
					return window.devicePixelRatio;
				}
				return 1;
			},
			/**
			 * 将传入值转为整数
			 * @param value
			 * @returns {number}
			 */
			parseValue(value) {
				return parseInt(value, 10);
			},

            // 截图后保存到本地
			generateImage(event, ownerInstance) {
				// 获取想要转换的dom节点
				var dom = document.getElementById('container');
				html2canvas(dom, {
					// allowTaint: false,
					width: dom.clientWidth,
					height: dom.clientHeight,
					scrollY: 0,
					scrollX: 0,
					useCORS: true
				}).then(function(canv) {
					// 将canvas转换成图片渲染到页面上
					let url = canv.toDataURL('image/jpg'); // base64数据
					ownerInstance.callMethod('getSaveImg', {
						base64data: url
					})
				});
			},

            // 截图后分享给好友
			generateImage_Share(event, ownerInstance) {
				// 获取想要转换的dom节点
				var dom = document.getElementById('container');
				html2canvas(dom, {
					// allowTaint: false,
					width: window.clientWidth,
					height: window.clientHeight,
					useCORS: true,
					dpi: 350
				}).then(function(canv) {
					// 将canvas转换成图片渲染到页面上
					let url = canv.toDataURL('image/jpg'); // base64数据
					ownerInstance.callMethod('getSaveImg_Share', {
						base64data: url,
					})
				});
			},
		}
	}
</script>

<style lang="scss" scoped>
	.content {
		// display: flex;
		// flex-direction: column;
		// align-items: center;
		// justify-content: center;
	}

	.card {
		width: 100%;
		background: #3F65F4;

		// padding: 16px;
		.topTitle {
			background: url('data:image/png;base64,iVBORw0K...GgoK5CYII=') no-repeat;//这里想要图片能够截取清晰则必须使用base64
			background-size: 100% 100%;
			width: 100%;
			height: 151px;
			padding: 16px;

			.title {
				font-weight: 600;
				font-size: 36px;
				color: #F5F5F7;
			}

			.time {
				margin-top: 15px;
				font-weight: 500;
				font-size: 12px;
				color: #fff;
			}
		}
    }
</style>

方法二 播放视频时截图

<template>
	<z-paging-swiper>
		<view slot="top" style="height: 40px;">
			<u-tabs-swiper ref="uTabs" :list="tabList" active-color="#5148ff" :current="current" @change="tabsChange"
				:is-scroll="false" swiperWidth="750"></u-tabs-swiper>
		</view>
		<swiper class="swiper" :current="swiperCurrent" @transition="transition" @animationfinish="animationfinish">
			<swiper-item class="swiper-item">
				<view>
					<video id="container" class="videoBox" :src="playUrl" :controls="true"
						:enable-progress-gesture="false" :title="videoName+videoCode" :is-live="true">
					</video>
				</view>
				<view class="ctrlBox">
					<view class="remoteBox">
						<zhangyubao-remote @remote="remote"></zhangyubao-remote>
					</view>
				</view>
				<view>
					<button @click="doshot"> 抓拍</button>
				</view>
			</swiper-item>
			<swiper-item class="swiper-item">
			    2
			</swiper-item>
			<swiper-item class="swiper-item">
                3
			</swiper-item>
		</swiper>

	</z-paging-swiper>
</template>

<script>
	import {
		throttle,
		formatDate
	} from '@/common/util.js'
	export default {
		data() {
			return {
				videoCode: '',
				videoId: '',
				videoNo: null,
				videoName: '',
				playUrl: '',
				current: 0, // tabs组件的current值,表示当前活动的tab选项
				swiperCurrent: 0,
				// 回放时间
				datetimerange: [],
				// 抓拍时间
				datetimerangePic: [],
				dataList: [],
				videoContext: ''
			}
		},
		onLoad(options) {
			
		},
		methods: {

			// tabs通知swiper切换
			tabsChange(index) {
				this.swiperCurrent = index
			},
			// swiper-item左右移动,通知tabs的滑块跟随移动
			transition(e) {
				let dx = e.detail.dx
				this.$refs.uTabs.setDx(dx)
			},
			// swiper滑动结束,分别设置tabs和swiper的状态
			animationfinish(e) {
				let current = e.detail.current
				this.$refs.uTabs.setFinishCurrent(current)
				this.swiperCurrent = current
				this.current = current
				console.log("tab滑动", this.current);
			},
			datetimePlay(e) {
				console.log("回放时间", e);
			},
			datetimePic(e) {
				console.log("抓拍时间", e);
			},
			doshot() {
				this.videoContext = uni.createVideoContext('container'); //创建视频实例指向video
				this.videoContext.pause(); //先对视频进行暂停,防止截图黑屏
				this.$nextTick(() => {
					this.getCapture()
				})
			},
			getCapture() {
				let that = this
				let pages = getCurrentPages();
				let page = pages[pages.length - 1];
				let ws = page.$getAppWebview()
				var bitmap = new plus.nativeObj.Bitmap('test');
				// 将webview内容绘制到Bitmap对象中  
				ws.draw(bitmap, () => {
					// 将原生Bitmap转换成Base64字符串  
					let base64data = bitmap.toBase64Data()
					bitmap.loadBase64Data(base64data, function() {
						// console.log("加载Base64图片数据成功");
						let time = formatDate(new Date(), 'yyyyMMddHHmmss')
						let url = '_downloads/four-faith_' + time + '.jpg';
						uni.hideLoading()
						bitmap.save(url, {}, function(fileinfo) {
							// console.log('保存图片成功:' + fileinfo);
							// 保存图片
							let params = {
								base64: base64data.split(',')[1],
								captureTime: formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss'),
								deviceNo: that.videoCode,
								fileName: "app_" + that.videoCode + '_' + that.videoNo + '_' +
									time +
									'.jpg',
								fileSize: fileinfo.size,
								videoNo: 1
							}
									uni.showToast({
										title: '抓拍成功',
										icon: 'none',
									})
								
							bitmap.clear();
						}, function(e) {
							onsole.log('保存图片失败:' + JSON.stringify(e));
							bitmap.clear();
						});
					}, function() {
						console.log('加载Base64图片数据失败:' + JSON.stringify(e));
						bitmap.clear();
					});
					this.videoContext = uni.createVideoContext('container'); //创建视频实例指向video
					this.videoContext.play();
				}, (e) => {
					console.log('截屏绘制图片失败:', e);
					uni.showToast({
						title: '抓拍失败',
						icon: 'none',
					})
				}, {
					check: true, // 设置为检测白屏
					// 设置截屏区域
					clip: {
						top: uni.getSystemInfoSync().statusBarHeight + 90,
						left: '0px',
						height: '400px',
						width: '100%'
					}
				});
			},
		}
	}
</script>

<style>
	page {
		background-color: #f6f5f8;
	}

	.swiper {
		height: 100%;
	}

	.videoBox {
		width: 100%;
		height: 300px;
		/* background-color: #fff000; */
	}

	.ctrlBox {
		margin-top: 30rpx;
	}

	.remoteBox {
		display: flex;
		justify-content: center;
	}

	.selectTime {
		padding: 10rpx 20rpx;
	}
</style>

方法三 小程序原生使用的截图

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: UniApp 是一个使用 Vue.js 开发跨平台应用的框架。它的运行原理是基于 HBuilderX 编辑器将开发者编写的代码转换成原生平台的代码,然后运行在各个平台上。 首先,开发者使用 HBuilderX 编辑器创建一个 UniApp 项目,并选择所要开发的平台,如微信小程序App、H5 等。然后,开发者使用 Vue.js 组件和语法编写应用的各个页面和功能。 UniApp 在编译的过程中,通过将开发者编写的代码转换为各个平台的运行代码,使得应用在不同平台上都能够正常运行。例如,对于微信小程序UniApp 会将代码转换为符合微信小程序标准的 wxml、wxss 和 js 文件;对于 AppUniApp 会将代码转换为原生的 Android 或 iOS 代码。 UniApp 还提供了一套跨平台的 API,使得开发者能够方便地调用原生平台的功能和接口。比如,开发者可以使用 uni.request 方法来发起网络请求,无论是在微信小程序还是 App 中,都能够正常使用。 最后,UniApp 使用各个平台的打包工具将应用打包成可执行文件或可发布的代码文件。对于微信小程序UniApp 会生成一个可以导入到微信开发者工具中预览和发布的项目文件夹;对于 AppUniApp 会生成原生的 Android 或 iOS 项目,开发者可以进行进一步的编译和发布。 综上所述,UniApp 的运行原理是将开发者编写的代码转换为各个平台的原生代码,并提供跨平台的 API,使得应用能够在不同平台上运行和发布。这种方式减少了开发者的工作量,提高了开发效率,使得开发跨平台应用变得更加简单和便捷。 ### 回答2: UniApp一种基于Vue.js框架的跨平台开发解决方案,可以同时开发iOS、Android和Web应用。UniApp的运行原理主要是基于两个关键技术点:编译和渲染。 首先,UniApp应用在开发阶段使用Vue.js框架进行编写,开发者使用Vue的语法和相关技术进行业务和界面的构建。UniApp将Vue.js框架进行了扩展和适配,使其能够同时运行在不同的平台上。 在编译阶段,UniApp会将开发者编写的Vue代码转换为原生的JavaScript代码。它会根据应用的配置文件和平台的特性,进行相应的编译优化和转换。通过这个过程,UniApp将统一的Vue代码转换为特定平台的原生代码。 在渲染阶段,UniApp使用了各个平台自带的渲染引擎进行UI的渲染。对于iOS和Android,UniApp使用了各自的原生渲染引擎进行渲染;对于Web平台,UniApp使用了WebView进行渲染。UniApp将编译生成的原生代码交给相应的渲染引擎进行解析和渲染,最终呈现出用户界面。 除了编译和渲染外,UniApp还提供了一套统一的API和组件库。这些API和组件库可以在不同平台上实现一致的功能和样式,开发者可以直接调用这些API和组件进行业务的开发和界面的构建。 综上所述,UniApp的运行原理是通过编译和渲染来实现跨平台的应用开发。通过编译将统一的Vue代码转换为特定平台的原生代码,并使用各个平台的渲染引擎进行UI的渲染,最终实现在不同平台上运行的应用。这种原理使得开发者可以用一套代码同时开发多个平台的应用,提高了开发效率和代码复用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值