dom截图的几种实现方式

news2024/10/5 11:21:36

前端要实现dom截图的功能,现在比较常用的是使用以下两个库

  • dom-to-image 使用svg技术实现
  • html2canvas 使用canvas技术实现

如果想自己写一个dom截图的可以参考

  • dom-pointer 代码比较简单,非常适合拿来研究
  • rasterizeHTML.js 目前rasterizeHTML.js已经被用于知乎-意见反馈功能。

两种截图方式

  1. SVG 效率高
    dom-to-image库主要使用的是SVG实现方式,简单来说就是先把DOM转换为SVG然后再把SVG转换为图片。

  2. Canvas
    html2canvas的内部实现相对dom-to-image来说要复杂一些, 基本原理是读取DOM元素的信息,基于这些信息去构建截图,并呈现在canvas画布中。

以上两种常见的npm库,对应着两种常见的实现原理。实现前端截图,一般是使用图形API重新绘制页面生成图片,基本就是SVG(dom-to-image)和Canvas(html2canvas)两种实现方案,两种方案目标相同,即把DOM转为图片,下面我们来分别看看这两类方案。

dom-to-image

个人认为这个库比较好用

<script src="https://cdnjs.cloudflare.com/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js"></script>

vue实现

import domtoimage from "dom-to-image";

// dom截图
domShot(dom) {
  domtoimage
    .toPng(dom, { quality: 0.92 })
    .then((dataUrl) => {
      //保存图片
      let saveFile = (data, filename) => {
        let img = new Image();
        img.src = data;
        img.onload = () => {
          // 缩放图片
          const dataUrl = this.scalcImage(img);
          this.download(dataUrl, filename);
        };
      };
      saveFile(dataUrl, this.getFilename());
    });
},
// 下载图片
download(dataUrl, filename) {
  var blob_ = this.data_to_blob(dataUrl); // 转换为 blob
  var link = document.createElement("a");
  link.setAttribute("href", window.URL.createObjectURL(blob_));
  link.setAttribute("download", filename);
  link.click();
},
// 缩放图片到0.8
scalcImage(img) {
  var canvas = document.createElement("canvas"); // 创建canvas元素
  var scale = 0.8;
  var width = img.width * scale; // 确保canvas的尺寸和图片一样
  var height = img.height * scale;
  canvas.width = width;
  canvas.height = height;
  canvas.getContext("2d").drawImage(img, 0, 0, width, height); // 将图片绘制到canvas中
  const dataUrl = canvas.toDataURL("image/png"); // 转换图片为dataURL
  return dataUrl;
},
// 获得文件名
getFilename() {
  //获取年月日作为文件名
  const timers = new Date();
  const fullYear = timers.getFullYear();
  const month = timers.getMonth() + 1;
  const date = timers.getDate();
  const randoms = Math.random() + "";
  //年月日加上随机数
  let numberFileName =
    fullYear + "" + month + date + randoms.slice(3, 10);
  return numberFileName + '.png'
}

html2canvas

<script type="text/javascript" src="http://html2canvas.hertzen.com/dist/html2canvas.js"></script>
import html2canvas from 'html2canvas';
html2canvas(dom).then((canvas) => {
  this.download(canvas.toDataURL("image/png"), this.getFilename())
})

相关配置
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1231. 航班时间(恶心的输入处理 + 简单的数学)

题目如下&#xff1a; 题解 or 思路&#xff1a; 因为题目假设两次飞行时间是相同的&#xff0c;我们可以通过减法将时差消去。那么飞行时间就是: time1time22\frac{time_1 time2}{2}2time1​time2​ 题目的难点是处理输入&#xff0c;我们可以使用 sscanf 来进行处理&#x…

小程序开发经验分享(1)

账号搭建篇 1. 获取微信小程序的AppID 首先,我们需要拥有一个帐号,如果你能看到该文档,我们应当已经邀请并为你创建好一个帐号。注意不可直接使用服务号或订阅号的AppID。 利用提供的帐号,登录 https://mp.weixin.qq.com ,就可以在网站的“设置”-“开发者设置”中,查…

MySQL高级 SQL优化【插入数据主键优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;插入数据 1.1.1&#xff1a;insert 1). 优化方案一&#xff08;批量插入数据) 2). 优化方案二&#xff08;手动控制事务&#xff09; 3). 优化方案三 &#xff08;主键顺序插入&#xff0c;性能要高于乱序插入。&#xff09; …

java应用集成HanLP进行中文自然语言分词详细完整案例以及demo

本文可以作为上一篇《mysql/mariadb 实现全文检索》的补充&#xff0c;实现对字符串分词的逻辑 什么是自然语言&#xff0c;什么是自然语言分词及例子 什么是自然语言 狭义地讲&#xff0c;利用计算机进行语言分析的研究是一门语言学与计算机科学的交叉学科&#xff0c;学术界…

CTFSHOW新手杯MISC部分WriteUp

引文 之前复现了CTFSHOW新人杯的WEB方向部分题目&#xff0c;今天就复现一下MISC为主的题目&#xff0c;可能有些读者不太明白MISC方向是什么意思&#xff0c;简单来说就是"杂项",包括&#xff1a;隐写&#xff0c;压缩包处理&#xff0c;流量分析&#xff0c;攻击取…

电容基础知识

电解电容负极有标识标有耐压值&#xff08;400V 450WV&#xff09; 容量 &#xff08;68UF&#xff09; 温度&#xff08;105摄氏度&#xff09;等 电容容量判断方法&#xff1a;直标法&#xff1a;上图&#xff0c;容量68微法&#xff0c;耐压值400V。数字表示法&#xff1a;方…

如何在公司审计中保持安全

如何在公司审计中保持安全 如今&#xff0c;财务弹性是决定您的公司能否在不确定时期适应和发展的主要属性之一。这可能令人很惊讶&#xff0c;但您的年度业务审计可以成为您提高业务敏捷性的秘密武器。它通过确定内部控制和财务报告的效果以及哪些流程改进应该在您的优先级列…

蓝桥杯Python练习题15-区间k大数查询

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定一个序列&#xff0c;每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式   第一行包含一个数n&#xf…

黑马Hive+Spark离线数仓工业项目-任务流调度工具AirFlow(2)

Oracle与MySQL调度方法 目标&#xff1a;了解Oracle与MySQL的调度方法 实施 Oracle调度&#xff1a;参考《oracle任务调度详细操作文档.md》 - step1&#xff1a;本地安装Oracle客户端 - step2&#xff1a;安装AirFlow集成Oracle库 - step3&#xff1a;创建Oracle连接 - ste…

ODT在手,DDR5布线可以任性走?

作者&#xff1a;一博科技高速先生成员 姜杰 ODT是On Die Termination的缩写&#xff0c;又叫片内端接&#xff0c;顾名思义&#xff0c;就是把端接电阻放在了芯片内部。作为一种端接&#xff0c;ODT可以减小反射&#xff0c;对信号质量的改善显而易见&#xff0c;SI攻城狮很…

家用宽带搭建个人服务器(二)

本文主要详记免费二级域名注册和免费DDNS解析 写在前头 近几年国内注册域名需要备案&#xff0c;域名解析服务商都陆续需要收费了&#xff0c;对于我这种想简单玩玩的人来说实在是太麻烦了(主要是费钱&#xff09;&#xff0c;花了点时间找到了免费域名注册和DDNS解析 本文基于…

Android绘制原理【通透版】

概述 Android 的显示过程可以简单概括为&#xff1a;Android 应用程序把经过测量、布局、绘制后的surface 缓存数据&#xff0c;通过 SurfaceFlinger 把数据渲染到显示屏幕上&#xff0c;通过 Android 的刷新机制 来刷新数据。也就是说应用层负责绘制&#xff0c;系统层负责渲…

豪掷千亿的卡塔尔,为什么建造可回收的足球场?

作者&#xff1a;木环 来自世界六大洲的八强&#xff0c;正为大力神杯做最后的角逐。在精彩的比赛之外&#xff0c;这届世界杯还留下了很多破圈元素&#xff1a;卡塔尔的两千亿、逗笑的饺子皮表情包、推迟到冬季举办的赛事、围困啤酒赞助商的禁酒令。 以及&#xff0c;一个标…

Jackson 自定义序列化器的使用

注意&#xff1a;从简单的例子去延伸使用&#xff0c;内容紧凑&#xff0c;排版就这样了哈 举例&#xff1a;自定义序列化器&#xff0c;让输出json的指定字段金额10 public class testMain {public static void main(String[] args) throws JsonProcessingException {Bill b…

【BP靶场portswigger-服务端5】业务逻辑漏洞-11个实验(全)

目录 一、业务逻辑漏洞 1、意义 2、业务逻辑漏洞的产生 3、产生的影响 二、过度信任客户端控件 1、简述 实验1&#xff1a;过度信任客户端控件 三、未处理非常规输入 1、简述 实验2&#xff1a;高级逻辑漏洞 实验5&#xff1a;低级逻辑缺陷 实验6&#xff1a;异常输入处…

服务器防勒索病毒经验分享

场景描述 互联网飞速发展&#xff0c;各企业均搭建了自己的服务器。包括文件服务器、代码服务器、业务系统服务器、数据库服务器等。目前大多数企业使用的服务器系统以Windows Server和Linux&#xff08;Centos&#xff09;居多&#xff0c;但随着国产操作系统的崛起&#xff…

Altium Designer 20 凡亿教育视频学习-03

第三部分学习 封装具备的元素 紫色部分就是阻焊部分&#xff0c;阻焊作用&#xff1a;防止绿油覆盖 封装制作 Tab键调出属性菜单 当放置焊盘的时候&#xff0c;按Tab键&#xff0c;可以打开属性面板&#xff0c;并且更改是贴片还是插孔的 测量距离 Ctrl M 测量功能 测量…

Day 17-其它 Composition API_ 依赖注入provide / inject

Provide / Inject 当我们需要从父组件向子组件传递数据时&#xff0c;我们使用 props可以实现&#xff01; 想象一下这样的结构&#xff1a;有一些深度嵌套的组件&#xff0c;而深层的子组件只需要父组件的部分内容。在这种情况下&#xff0c;如果仍然将 props 沿着组件链逐级…

CORS 跨域资源共享

目录 1. 接口的跨域问题 2. 使用 cors 中间件解决跨域问题 3. 什么是 CORS 4. CORS 的注意事项 5. CORS 响应头部 - Access-Control-Allow-Origin 6. CORS 响应头部 - Access-Control-Allow-Headers 7. CORS 响应头部 - Access-Control-Allow-Methods 8. CORS请求的…

SpringMVC程序详解

1.什么是 Spring MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“Spring MVC”。 从上述定义我们可以得…