前端js代码实现截图功能

前端js代码实现截图功能

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

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

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

html2canvas官网

html2canvas是一种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.js

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();
})();

用命令

node puppeteer.js

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

3.

还有其他方法待更新…

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶尔躲躲乌云_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值