网页转图片的方法(超出可视范围的也可以)dom-to-image

        在工作中偶尔会遇到要将整个网页或者网页的局部转为图片保存下来,最开始使用html2canvas,发现只能转可视窗口里面的元素,并且会存在css样式乱码、饿了么组件变形等问题,最后发现使用dom-to-image可以实现自己的需求

一、安装dom-to-image

npm install dom-to-image

二、演示页面

先做一个简单的demo页面,做了预览功能和下载功能。

<template>
  <div class="content">
    <div class="left">
      <el-button type="primary" @click="preview">预览</el-button>
      <el-button type="primary" @click="download">下载</el-button>
      <el-image
          style="width: 200px; height: auto;margin-top: 100px"
          :src="imgUrl"
          :zoom-rate="1.2"
          :max-scale="7"
          :min-scale="0.2"
          :preview-src-list="[imgUrl]"
          :initial-index="1"
          fit="cover"
      />
    </div>
    <div class="right" ref="rightRef">
      <div class="item red"></div>
      <div class="item green"></div>
      <div class="item blue"></div>
      <div class="item gray"></div>
    </div>
  </div>
</template>

<style scoped lang="scss">
.content {
  width: 100vw;
  height: 100vh;
  display: flex;

  .left {
    width: 300px;
  }

  .right {
    flex: 1;
    overflow: auto;
  }

  .item {
    width: 100%;
    height: 33%;
    margin-bottom: 20px;
  }

  .red {
    background-color: rgba(255, 0, 0, .5);
  }

  .green {
    background-color: rgba(0, 255, 28, .5);
  }

  .blue {
    background-color: rgba(55, 2, 255, .5);
  }

  .gray {
    background-color: rgba(179, 179, 179, .5);
  }
}

</style>

三、dom-to-image的使用

import domtoimage from 'dom-to-image';

const rightRef = ref() //要进行转化为图片的元素对象
const imgUrl = ref() //用于存储图片地址

//预览图片
function preview() {
  domtoimage.toPng(rightRef.value)
      .then(function (base64Image:any) {
        imgUrl.value = base64Image  //转化出来后的数据是base64的类型
      })
}

点击预览后,当前窗口中的元素就已经被转为图片格式了

四、当前页面超出滚动条部分的处理

根据dom-to-image官网:https://github.com/tsayen/dom-to-image?tab=readme-ov-file的提示,可以设置图片的宽高和样式

于是可以在生成图片的时候,将图片的宽高设置为所需元素的宽高

//预览图片
function preview() {
  // 临时移除高度限制(如果需要)
  const originalHeight = rightRef.value.style.height;

  rightRef.value.style.height = 'auto'; //先把高度放开

  // 定义图片的变量
  const option = { 
    width: rightRef.value.scrollWidth,  // 确保宽度包含所有内容
    height: rightRef.value.scrollHeight, // 确保高度包含所有内容
    style: {
      overflow: 'visible',      // 确保内容不会被裁剪
    },
  }
  domtoimage.toPng(rightRef.value,option)
      .then(function (base64Image:any) {
        rightRef.value.style.height = originalHeight; // 再将盒子恢复成原样
        imgUrl.value = base64Image
      })
}

这个时候,点击预览出现的图片,就会是完整的元素图片

再添加一个下载功能

function download() {
  // 下载日报图片
  const a = document.createElement('a');
  a.href = imgUrl.value;
  a.download = '网址转图片.png';
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}

五、完整demo代码

<script setup lang="ts">
import {ref} from 'vue'
import domtoimage from 'dom-to-image';

const rightRef = ref() //需要进行网页转图片的实例
const imgUrl = ref() //用于存放base64

//预览图片
function preview() {
  // 临时移除高度限制(如果需要)
  const originalHeight = rightRef.value.style.height;

  rightRef.value.style.height = 'auto'; //先把高度放开

  // 定义图片的变量
  const option = {
    width: rightRef.value.scrollWidth,  // 确保宽度包含所有内容
    height: rightRef.value.scrollHeight, // 确保高度包含所有内容
    style: {
      overflow: 'visible',      // 确保内容不会被裁剪
    },
  }
  domtoimage.toPng(rightRef.value,option)
      .then(function (base64Image:any) {
        rightRef.value.style.height = originalHeight; // 再将盒子恢复成原样
        imgUrl.value = base64Image
      })
}

function download() {
  // 下载日报图片
  const a = document.createElement('a');
  a.href = imgUrl.value;
  a.download = '网址转图片.png';
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}


</script>

<template>
  <div class="content">
    <div class="left">
      <el-button type="primary" @click="preview">预览</el-button>
      <el-button type="primary" @click="download">下载</el-button>
      <el-image
          style="width: 200px; height: auto;margin-top: 100px"
          :src="imgUrl"
          :zoom-rate="1.2"
          :max-scale="7"
          :min-scale="0.2"
          :preview-src-list="[imgUrl]"
          :initial-index="1"
          fit="cover"
      />
    </div>
    <div class="right" ref="rightRef">
      <div class="item red"></div>
      <div class="item green"></div>
      <div class="item blue"></div>
      <div class="item gray"></div>
    </div>
  </div>
</template>

<style scoped lang="scss">
.content {
  width: 100vw;
  height: 100vh;
  display: flex;

  .left {
    width: 300px;
  }

  .right {
    flex: 1;
    overflow: auto;
  }

  .item {
    width: 100%;
    height: 33%;
    margin-bottom: 20px;
  }

  .red {
    background-color: rgba(255, 0, 0, .5);
  }

  .green {
    background-color: rgba(0, 255, 28, .5);
  }

  .blue {
    background-color: rgba(55, 2, 255, .5);
  }

  .gray {
    background-color: rgba(179, 179, 179, .5);
  }
}

</style>

很好用的网页换为图片的工具了。 有人收藏邮票,有人收藏奇石,有人收藏古画,林林总总,无奇不有。在中国,互联网络从出现到现在快二十年了,您有没有从中发现某些收藏的机会呢? 假如您的亲朋好友开设有网站,假如您在一年后,把他所拥有的网站的某些WEB页面以原样方式,把这一年中每一天的变迁呈现在他的面前,您认为他不会万分惊喜么?假如您把对自己有纪念意义的网站的主要页面持之以恒地进行收藏,比如:自己小学、中学或者大学母校的网站进行收藏,那么,若干年以后,当您把这些收藏再呈送给母校,难道不是一件特别有意义的事情么?或者,把自己所在单位的网站,或者某些处于创业期的公司的网站进行收藏,当这些公司若干年后成长为一家大型企业的时候,而当他们的老总看到自己创业期的网站的样子,难道他们不会觉得弥足珍贵么?假如,您需要从网上收集某些证据,而这些证据可能在很少的时候才会出现,那么,您也可以把这视为网页收藏的一个另类应用吧。总之,网页收藏,还是很有价值的。 与传统的纸质出版物相比,网络内容具有某种更高的易逝性。我们现在还能够比较容易地看到几十年、几百年前的原版图书,但是,对于如此众多的WEB网页,随着网站内容频繁地更新或者版面的改版,几分钟、几小时、几天、几月甚至几年前的某一个页面我们还能够复现么?没有有心人,这种复现是不可能的(有人可能会认为百度、Google等搜索引擎也有这些页面的快照,但是,您需要知道:搜索引擎不是每天都会去搜索某一个页面的,通常的时间间隔是一个星期左右,而且只是"可能"会搜集到您关心的WEB页面;更为重要的是,搜索引擎主要关心该页面的文字内容, 动画、图片等内容不会予以保留,特别地,搜索引擎不会关心该页面...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值