前端js代码实现截图功能

news/2024/7/19 14:12:14 标签: javascript, js, html

html" title=js>js_0">前端html" title=js>js代码实现截图功能

据我所知,屏幕截图大致可以分为两种类型
一种是真-屏幕截图,也就是我们平常QQ,微信,钉钉等社交工具里面所用到的截图。也就是说它能把我们看到的东西截取下来,所见即所得。
在这里插入图片描述
在这里插入图片描述

另一种是通过获取网页DOM元素的截图。它的原理就是获取到网页上的DOM元素,再将他们放到canvas画布里面,最后再又画布转为图片,这样就实现了屏幕截图的功能。目前有好多方法可以实现此功能,一 一 介 绍 :

html2canvas_8">1.html2canvas方法(最方便,最常用,效果也不错~)

html2canvas官网

html2canvas是一种JavaScript实现页面截图的类库。它使用起来比较方便。

使用方法:

html" title=javascript>javascript">import html2canvas from "html2canvas"

html2canvas(document.getElementById(container'),{
    backgroundColor: "transparent",
    allowTaint: true,
    }).then((canvas) => {
    	console.log(canvas)
        // 将画布展示到最前端
        canvas.id = 'canvas'
        document.body.appendChild(canvas);
        document.getElementById('canvas').style.position = 'fixed'
        document.getElementById('canvas').style.top = '0'
        document.getElementById('canvas').style.left = '0'
        document.getElementById('canvas').style.zIndex = '9999'
        // 下载图片到本地
        var a = document.createElement("a");
        a.href = canvas.toDataURL("image/jpg");
        a.download = '图片';
        a.click();
});

其中,document.getElementById(container')指定了要截取哪个DOM元素中的内容。第二个参数对象{ backgroundColor: "transparent",allowTaint: true,}指定了一些截图的参数。详细见下表:

参数名称参数类型默认值描述
allowTaintbooleanfalse是否允许跨域
backgroundstring#fffcanvas的背景颜色,如果没有设定默认透明
heightnumbernullcanvas高度设定
letterRenderingbooleanfalse在设置了字间距的时候有用
loggingbooleanfalse在console.log()中输出信息
proxystringundefined代理地址
taintTestbooleantrue是否在渲染前测试图片
timeoutnumber0图片加载延迟,默认延迟为0,单位毫秒
widthnumbernullcanvas宽度
useCORSbooleanfalse涉及到画布转图片的问题(截图功能)

此表格来源于:html2canvas

上述表格中比较常用的就只是前两个,涉及到跨域问题。

踩坑记录
canvas渲染
在涉及到一些有二维地图的页面的时候,一开始没有配置允许跨域,发现截取不到地图等图层内容。我就以为地图等图层内容不存在于DOM元素上,后来检查页面元素节点树才发现,地图等图层也是放置在DOM元素上的,因此在配置了允许跨域后就能重新渲染出来。

canvas画布转图片
涉及到跨域的图片虽然能够渲染到canvas画布中,但是此时画布因为存在跨域的图片,已经受到了污染,因此无法正常转为图片。在执行上面的**保存画布为图片(即截图功能的实现)**的代码的时候,就需要将useCORS参数设置给加上去,并且设置为true。经过本人亲测,能够实现保存画布为图片(png格式,不知道为啥明明设置了toDataURL("image/jpg"),但还是转的png)。

2.puppeteer

puppeteer

使用方法:
puppeteer.html" title=js>js

html" title=javascript>javascript">const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.setViewport({ // 设置视窗大小
        width: 1920,
        height: 1080
    });
    await page.goto('https://zhfw.tianditu.gov.cn/'); // 打开页面
    await page.screenshot({path: 'example.jpg'}); // path: 截屏文件保存路径
    await browser.close();
})();

用命令

html" title=javascript>javascript">node puppeteer.html" title=js>js

运行一下该文件即可去到指定页面然后截图。

3.

还有其他方法待更新…


http://www.niftyadmin.cn/n/909575.html

相关文章

前端地图坐标系详解

1.地图类型 国外 国外一般就是GPS,谷歌地图 国内 百度地图,高德地图,腾讯地图,搜狗地图,天地图… 2.坐标系类型 WGS84坐标系 最常见的GPS,用的是WGS-84坐标系,也是原始坐标体系。一般用国…

go:interface{}、断言与类型转换

interface{}可用于向函数传递任意类型的变量,但对于函数内部,该变量仍然为interface{}类型(空接口类型), 不清楚这点将可能导致错误。如以下代码: package main import "fmt" /* **用于输出数组元…

分享一个微信小程序编辑页面的WXML模板

分享一个微信小程序编辑页面的WXML模板 最近在进行微信小程序开发的时候经常会碰到编辑页面的搭建,大致格式如图所示: 顶部:返回按钮和确认按钮,在中间还可以自行加上一些别的元素。中间部分:编辑的标题和内容底部&…

Teams(uva11609+组合)

I - TeamsTime Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 11609题意:有n个人。选多个人參加比赛,当中一个是队长。队长不同其它选手同样也算作不同的方案。。问你一共同拥有多少种方案。 思路…

Mybatis 3.3.0 Log4j配置

最近做一个SSM学习项目,配置log4j,mybatis用下面的方式配置,不管用,打印不出执行的SQL语句。 log4j.logger.java.sql.ConnectionDEBUGlog4j.logger.java.sql.PreparedStatementDEBUGlog4j.logger.java.sql.ResultSetDEBUG后面改用…

React 逻辑式导航 的实现(不刷新路由跳转)

React 逻辑式导航 问题描述 React中的路由大多是用React-router来实现的。但是标签和标签往往仅限于声明式路由&#xff0c;即往往写在标签中&#xff0c;用于主体界面之间的内容切换。如下所示&#xff1a;<Router ><Switch><Route exact path{"/"…

在浏览器的控制台中读取本机文件

在浏览器的控制台中读取本机文件 最近有这么一个需求&#xff1a;通过js代码直接读取到本机文件(项目部署并运行在浏览器端)&#xff0c;这里所说的直接读取不同于input标签点击之后选择文件然后通过FileReader读取到里面的内容。而是已知本机的本地路径直接读取&#xff0c;也…

(原创)c#学习笔记03--变量和表达式04--表达式03--运算符的优先级

3.4.3 运算符的优先级 在计算表达式时&#xff0c;会按顺序处理每个运算符。但这并不意味着必须从左至右地运用这些运算符。例如&#xff0c;有下面的代码&#xff1a; var1 var2 var3; 其中运算符就是在运算符之前进行计算的。在其他一些情况下&#xff0c;运算符的优先级并…