uniapp在App端根据页面内容生成图片保存到手机相册(安卓)

2,615 阅读1分钟

首先安装插件html2canvas。 在renderjs中使用这个插件,因为在app端无法直接使用。具体代码如下

<script module="render2" lang="renderjs">
	import html2Canvas from 'html2canvas'
	export default {
		data() {
			return {}
		},
		mounted() {},
		methods: {
			myprint(data) {
				this.$ownerInstance.callMethod('showLoading');
				const detail = document.querySelector("#content2PDF") //获取到html包含此页面的外层标签,detail为页面中需要导出为pdf的最外层标签的id名
				const imgHeight = detail.clientHeight;
				const imgWidth = detail.clientWidth;
				html2Canvas(detail, { //对应的dom元素id(class也可以)
					allowTaint: true, //是否允许跨域图像渲染画布
					useCORS: true, //是否尝试使用 CORS 从服务器加载图像 解决图片跨域问题
				}).then((canvas) => {
					return new Promise((resolve, reject) => {
						console.log(4);
						setTimeout(() => {
							console.log(5);
							resolve(canvas)
						}, 500)
					}).then((canvas) => {
						//生成的canvas实例
						var contentWidth = canvas.width; //所选元素宽度
						var contentHeight = canvas.height; //所选元素高度
						//一页pdf显示html页面生成的canvas高度;
						var pageHeight = contentWidth / 595.28 * 841.89;
						//未生成pdf的html页面高度
						var leftHeight = contentHeight;
						//pdf页面偏移
						var position = 0;
						//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
						var imgWidth = 555.28;
						var imgHeight = 555.28 / contentWidth * contentHeight;
						var pageData = canvas.toDataURL('image/jpeg', 1.0); //转成jpg格式
						this.$ownerInstance.callMethod('downPdf', pageData);
					}).catch((r) => {
						console.log(r);
						this.$ownerInstance.callMethod('hideLoading');
					})
				});

			}
		},
	}
</script>

在页面中绑定下载事件

<button class="downloadBtn" type="primary" @click="render2.myprint">下载</button>

保存到手机相册还需要一个插件image-tools。在页面的script标签中进行生成

<script>
	import {
		base64ToPath
	} from 'image-tools'
	export default {
		methods: {
			/**
			 * base64字符串转成文件
			 * @param {String} base64Str // 允许包含前缀
			 */
			base64ToFile(base64Str) {
				let imgUrl = base64Str.replace(/[\r\n]/g, '');
				//将base64位的图片路径转换为临时路径
				setTimeout(() => {
					const url = imgUrl;
					base64ToPath(url).then(path => {
                                                this.saveImage(path)
                                        })
                                        .catch(error => {
                                                console.error('图片的临时路径转换出错了:', error);
                                        });
				}, 500);



			}
			saveImage(path) {
				let that=this
				uni.saveImageToPhotosAlbum({
					filePath: path, // 需要临时文件路径,否则base64无法保存
					success: (path) => {
						that.hideLoading()
					},
					fail: (errMsg) => {
						console.log(errMsg);
					}
				});
			},

			downPdf(path) {
				this.base64ToFile(path, fileName)
			},
			showLoading() {
				uni.showLoading({
					title: '导出到手机相册中'
				})
			},
			hideLoading() {
				uni.hideLoading()
			},
		}
	}
</script>

之后就可以看到图片保存到了相册中