js截取页面内容、生成png(包括非可视区域)、下载到本地

哟,很有缘啊

我使用 html2canvas 完成页面截取以及下载功能。
插件在我的网盘内(永久有效,没有就是藏丢了)
链接:https://pan.baidu.com/s/1gLqx9QAaS_TMT9GQ9RHsUg 密码:vxbt
(有些朋友找不到 .js 文件
解压后js在:html2canvasv050\niklasvh-html2canvas-v0.5.0-beta4-0-g83e9b85\niklasvh-html2canvas-83e9b85\dist

首先引入我提供的 js,(自己喜欢的也行。)

<script type="text/javascript" charset="UTF-8" src="./js/printer/html2canvas.min.js"></script>

然后是 H5 ;

// 这个div 里面的内容就是我要打印的东西。
// 请注意:一定要用position:absolute 目的是将这个div 脱离文档流,目標是可截取非可视区域的内容
<div id="print" name="print" style="background-color: #FF1493;width: 711px; position: absolute;top: 100px;">

好!开始撸 js

			function html2canvas_2() {
			//获取截取区域的高度和宽度
				var TargetNode = document.querySelector("#print")
				var h = $(TargetNode).height()
				var w = $(TargetNode).width()
			//设置 canvas 画布的宽高 是容器搞度 2倍、为了是图片清晰
				/**1.创建画布
				 * 2.设置canvas 大小
				 * */
				var canvas = document.createElement("canvas");
				//这是画布整体的大小
				canvas.width = w * 2;
				canvas.height = h * 2;
				//这是绘画范围的大小
				canvas.style.width = w + "px";
				canvas.style.height = h + "px";
				canvas.style.color = "chartreuse"
				//画布缩小,将图片发大两倍 
				var context = canvas.getContext("2d")
				context.scale(2,2)
				// 再说一次 要截取全部,必须要脱离文档流 position: absolute; 否则只能截取到看到的部分。
				
				html2canvas($("#print"), { 
//					allowTaint: true,
//					taintTest: false,
//					canvas: canvas,
					onrendered: function(canvas) {
						// 图片导出为 png 格式
						var type = 'png';
						var imgData = canvas.toDataURL(type);
						var _fixType = function(type) {
							type = type.toLowerCase().replace(/jpg/i, 'jpeg');
							var r = type.match(/png|jpeg|bmp|gif/)[0];
							return 'image/' + r;
						};

						// png 替换 mime type 为了下载
						imgData = imgData.replace(_fixType(type), 'image/octet-stream');
						/**
						 * 在本地进行文件保存
						 * @param  {String} data     要保存到本地的图片数据
						 * @param  {String} filename 文件名
						 */
						var saveFile = function(data, filename) {
						//创建一个命名空间。是 a 标签
						var save_link =document.createElementNS('http://www.w3.org/1999/xhtml', 'a'); 
							save_link.href = data;
							save_link.download = filename;
							var 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);
						};
						// 下载后的问题名
						var filename = 'baidufe_' + (new Date()).getTime() + '.' + type;
						// download
						saveFile(imgData, filename);
					}
				})
			}
			

这样就完成了

微信小程序提供了canvas组件用来实现页面绘制生成图片功能。在js中,可以通过调用canvas组件的绘制API,将页面某个内容绘制canvas上,再通过canvas的toTempFilePath方法将canvas内容生成图片。 首先,在.wxml文件中定义一个canvas组件: ``` <canvas id="myCanvas" canvas-id="canvas" style="width: 300px; height: 300px;"></canvas> ``` 在.js文件中,通过获取页面中需要截取内容,然后将其绘制canvas上,并生成图片。具体代码如下: ```javascript // 获取页面中的某个DOM节点 const query = wx.createSelectorQuery() query.select('#content').boundingClientRect() // 这里的#content是你需要截取内容所在的DOM节点的选择器 query.exec((res) => { // 获取到节点的信息 const rect = res[0] const canvasContext = wx.createCanvasContext('canvas') // 设置canvas的宽高 const canvasWidth = 300 // canvas的宽度,根据需要设置 const canvasHeight = 300 // canvas的高度,根据需要设置 const dpr = wx.getSystemInfoSync().pixelRatio // 获取设备的像素比 // 将canvas的宽高乘以像素比,使得生成图片更加清晰 canvasContext.canvas.width = canvasWidth * dpr canvasContext.canvas.height = canvasHeight * dpr // 根据节点信息进行绘制 canvasContext.drawImage(rect.left * dpr, rect.top * dpr, rect.width * dpr, rect.height * dpr, 0, 0, canvasWidth * dpr, canvasHeight * dpr) // 绘制完成后,调用toTempFilePath方法生成图片 canvasContext.draw(false, () => { wx.canvasToTempFilePath({ quality: 1, canvasId: 'canvas', fileType: 'jpg', success(res) { // 生成图片成功后的回调函数 console.log(res.tempFilePath) }, fail(error) { // 生成图片失败后的回调函数 console.log(error) } }) }) }) ``` 以上代码中,我们使用了wx.createSelectorQuery方法来获取页面中需要截取的DOM节点的信息。然后,通过canvasContext.drawImage方法将该节点绘制canvas上。最后,调用canvasContext.draw方法进行绘制,并在完成后调用canvasToTempFilePath方法生成图片生成图片成功后,可以在success回调函数中获取到生成图片路径,可以使用这个路径进行其他操作。 需要注意的是,canvas组件的绘制是异步的,如果要在绘制完成后进行其他操作,需要在回调函数中进行。同时,生成图片会保存在临时文件中,在不需要时要进行清理,防止占用设备空间。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值