使用dom-to-image截图html区域为一张图

第一步安装npm i dom-to-image
第二步引入: import domToImage from 'dom-to-image';
第三步截图:

javascript 复制代码
// 截图
function screenshot() {
  return new Promise((resolve, reject) => {
    const images = document.querySelectorAll('.isCrossOrigin'); //给需要截图的图片都加上clss名称便于获取
    const videos = imageWrapper.value.querySelectorAll('video'); // 获取画布下所有视频元素
    // 隐藏所有视频元素,因为截出来的视频是黑屏
    videos.forEach((video) => {
      video.style.display = 'none';
    });
    images.forEach((img) => {
      // 保存原始的图片地址
      const originalSrc = img.getAttribute('src');
      // 移除 src 属性,设置 crossOrigin解决图片跨域,然后再设置 src
      img.removeAttribute('src');
      img.crossOrigin = 'anonymous';
      img.src = originalSrc;
    });
    domToImage.toBlob(imageWrapper.value, {
      cacheBust: true,  //添加 cacheBust 选项以确保不会使用缓存图片
      width: bgSrcWidth.value,
      height: bgSrcHeight.value,
    })
      .then(function (blob) {
        // 截图成功后,去除跨域设置
        images.forEach((img) => {
          img.removeAttribute('crossOrigin');
        });
        // 显示视频元素
        videos.forEach((video) => {
          video.style.display = 'block';
        });
        const formData = new FormData();
        formData.append('file', blob, 'image.png');
        uploadBgImg(formData).then((res) => {
          resolve(res.data)
        })
      }).catch((err) => {
        // 如果出现错误,去除跨域设置并恢复所有视频元素
        images.forEach((img) => {
          img.removeAttribute('crossOrigin');
        });
        videos.forEach((video) => {
          video.style.display = 'block';
        });
        reject(err);
      })
  })
}

缺点:截图时间特别长,视频截图是黑屏,暂时还没解决,大家有解决的欢迎指正~

相关推荐
Web4Browser1 分钟前
Headless 浏览器自动化适合哪些任务?巡检、截图和提交动作要分级
运维·前端·自动化
用户059540174465 分钟前
把前端内存泄漏排查从2小时压到5分钟,我们把它集成进了CI
前端·css
申君健24864182772021 小时前
Vapor 核心数据结构:Block原理
前端
山内桜良11 小时前
HarmonyOS中,html 与 ets 桥接沟通
华为·html·harmonyos
Csvn1 小时前
工程化专题 | 改完组件保存,浏览器毫无反应,重启 dev server 又好了——气不气?
前端
我有满天星辰1 小时前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
光影少年1 小时前
RN 渲染原理:不依赖WebView,原生控件渲染
前端·react native·react.js·前端框架
小白学过的代码1 小时前
# flv.js / mpegts.js 播不了国标摄像头(H.265 + G.711A)?纯前端 Jessibuca 无后端方案(附完整代码)
前端·javascript·h.265
console.log('npc')2 小时前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
法外狂徒12 小时前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能