vue使用html2Canvas将页面中的一部分内容保存为图片

vue使用html2Canvas将页面中的一部分内容保存为图片

安装并引入html2Canvas
npm i html2canvas -S

引入

import html2canvas from 'html2canvas'
使用(html标签)
<!-- 以$refs选中DOM -->
<div ref="vueDomSaveToImage">
	<!--   页面内容,正常写html及css即可,这部分会被保存为图片   -->
</div>
<el-button type="primary" @click="saveToImage">保存图片</el-button>
保存方法实现 js
	/** 保存为图片 */
    function saveToImage(){
      Loading.service({text:'正在导出...',background:'rgba(0,0,0,0.7)'});	//等待loading,可不要,直接去掉
      this.$nextTick(()=>{
        html2Canvas(this.$refs.vueDomSaveToImage).then(res=>{
          let imgUrl = res.toDataURL('image/png')
          // console.log('图片临时地址',imgUrl)
          let aLink = document.createElement('a');
          aLink.href = imgUrl;
          aLink.download = new Date().toLocaleString() + '.png';	//导出文件名,这里以时间命名
          document.body.appendChild(aLink);
		  // 模拟a标签点击事件
          aLink.click()
		  // 事件已经执行,删除本次操作创建的a标签对象
          document.body.removeChild(aLink)
          // // 以服务的方式调用的 Loading 需要异步关闭
          setTimeout(() => {
              Loading.service().close();
			  console.log(''图片导出成功)
            }, 10);
          })
      })
	},
	// 方法二, 原理和方法一是一样的,都是借助a标签
	function saveToImage2(){
		this.$nextTick(()=>{
			html2Canvas(this.$refs.vueDomSaveToImage).then(res=>{
				const save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
				save_link.href = imgUrl;
				save_link.download = new Date().toLocaleString()+ '.png';
				const event = document.createEvent('MouseEvents');
				event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
				save_link.dispatchEvent(event);
			})
		})
	}

若被保存的DOM中有网络资源图片保存不了,保存后图片位置空白:
可以将图片url转化为base64,显示到页面再保存(此操作在保存动作之前,最好页面一加载就做)

图片url转base64
	/** 图片url转base64, 以回调函数返回结果 */
	function getImageBase64(url, callback) {
        var Img = new Image(), dataURL = '';
        Img.src = url + '?v=' + Math.random();
        // 使用canvas去生成dataURL,避免二次请求,在创建Image对象的时候,给image对象设置了如下属性(目的是为了避免出现canvas污染的问题)
        Img.setAttribute('crossOrigin', 'Anonymous');
        Img.onload = function() {
			var canvas = document.createElement('canvas'),
			width = Img.width,
			height = Img.height;
			canvas.width = width;
			canvas.height = height;
			canvas.getContext('2d').drawImage(Img, 0, 0, width, height);
			dataURL = canvas.toDataURL('image/jpeg');
			return callback ? callback(dataURL) : null;
        };
    }
getImageBase64('https://tse3-mm.cn.bing.net/th/id/OIP-C.rHuc8SKa0wLVwCqqA27uIwHaEt?pid=ImgDet&rs=1',(uu)=>{
   console.log('base转化结果:',uu)
})
Vue,你可以使用递归函数配合数组操作来实现这个功能。首先,假设你有两个数组`array1`和`array2`,它们都有'id'和'name'属性。下面是一个基本的示例: ```javascript <template> <div id="container" v-for="(item1, index) in array1"> <!-- 使用v-if检查id是否匹配 --> <div v-if="findItemById(array2, item1.id)"> {{ item1.name }} </div> </div> </template> <script> export default { data() { return { array1: [ // 这里是你的数组一内容 ], array2: [ // 这里是你的数组二内容 ] }; }, methods: { findItemById(arr, id) { // 递归查找 return arr.find(item => item.id === id) ? item.name : this.findItemById(arr.slice(1), id); // 如果找到返回name,否则继续递归搜索 } } }; </script> <!-- HTML2Canvas 部分通常需要借助库如vue-html2canvas --> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script> <script> this.$nextTick(() => { html2canvas(document.getElementById('container'), { onrendered: function(canvas) { // 将canvas转换为图片并下载或者保存 var img = document.createElement('img'); img.src = canvas.toDataURL(); // 下载图片或显示 downloadImage(img); } }); }); function downloadImage(img) { var link = document.createElement('a'); link.href = img.src; link.download = 'result.png'; link.click(); } </script> ``` 在这个例子,`findItemById`方法会递归地在数组`array2`查找与`array1`元素对应的项。找到则返回其`name`值,否则继续下一层递归。最后通过HTML2Canvas将渲染后的DOM导出为图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值