Dom 元素转换 Image 图片 (截图)

Dom 元素转换 Image 图片 (截图)

dom-to-image

dom-to-image NPM 官网文档

参考文章@码上行舟

dom-to-image 是如何将 html 转换成图片的(文章参考)

安装

npm install dom-to-image --save

使用

/* in ES 6 */
import domtoimage from "dom-to-image";
/* in ES 5 */
var domtoimage = require("dom-to-image");

var node = document.getElementById("my-node"); //  获取需要转换成图片的dom元素

domtoimage
  .toPng(node)
  .then(function (dataUrl) {
    var img = new Image();
    img.src = dataUrl;
    document.body.appendChild(img);
  })
  .catch(function (error) {
    console.error("oops, something went wrong!", error);
  });

案例解释

vue2 项目,复制代码即可看见效果

<template>
  <div class="container">
    <el-table
      class="tableDom"
      ref="tableRef"
      :data="tableData"
      style="width: 100%"
      border
    >
      <el-table-column type="selection" width="55"> </el-table-column>
      <el-table-column prop="date" label="日期" width="180"> </el-table-column>
      <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
      <el-table-column prop="sex" label="性别" width="180"> </el-table-column>
      <el-table-column prop="address" label="地址"> </el-table-column>
    </el-table>
    <div style="background: tomato; width: 100%">
      <img :src="imageUrl" alt="" />
    </div>
  </div>
</template>

<script>
  import domtoimage from "dom-to-image";
  export default {
    name: "Helloworld",
    mounted() {
      let tableDom = document.querySelector(".tableDom");
      this.domShot(tableDom);
    },

    data() {
      return {
        imageUrl: "",
        tableData: [
          {
            date: "2016-05-02",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1518 弄",
          },
          {
            date: "2016-05-02",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1518 弄",
          },
          {
            date: "2016-05-02",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1518 弄",
          },
          {
            date: "2016-05-04",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1517 弄",
          },
          {
            date: "2016-05-01",
            name: "王小虎",
            sex: "王小虎",
            address: "上海市普陀区金沙江路 1519 弄",
          },
          {
            date: "2016-05-01",
            name: "王小虎",
            sex: "王小虎",
            address: "上海市普陀区金沙江路 1519 弄",
          },
          {
            date: "2016-05-01",
            name: "王小虎",
            sex: "王小虎",
            address: "上海市普陀区金沙江路 1519 弄",
          },
          {
            date: "2016-05-01",
            name: "王小虎",
            sex: "王小虎",
            address: "上海市普陀区金沙江路 1519 弄",
          },
          {
            date: "2016-05-03",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1516 弄",
          },
        ],
      };
    },
    methods: {
      domShot(dom) {
        domtoimage.toPng(dom, { quality: 0.92 }).then((dataUrl) => {
          //保存图片
          this.imageUrl = dataUrl;
        });
      },
    },
  };
</script>

<style lang="scss" scoped></style>

dom-to-image 部分方法封装


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'
}


  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中将DOM节点转换为图像需要借助于HTML5的Canvas元素和toDataURL()方法。下面是具体步骤: 1. 安装html2canvas 在Vue中使用html2canvas库可以方便地将DOM节点转换为图像。可以使用npm或yarn安装html2canvas: ``` npm install html2canvas --save ``` 或 ``` yarn add html2canvas ``` 2. 编写代码 在Vue组件中,可以通过refs获取要转换图片DOM节点。然后可以在mounted钩子函数中使用html2canvas库将DOM节点绘制到Canvas元素上。最后,可以将Canvas元素转换为base64编码的图像数据,将其设置为图片的src属性。 以下是示例代码: ``` <template> <div> <div ref="content"> <!-- 要转换图片的内容 --> </div> <button @click="convertToImage">转换图片</button> <img ref="image"> </div> </template> <script> import html2canvas from 'html2canvas'; export default { mounted() { // 将DOM节点转换为Canvas元素 html2canvas(this.$refs.content) .then(canvas => { // 将Canvas元素转换为图像数据 const dataURL = canvas.toDataURL(); this.$refs.image.src = dataURL; }) }, methods: { convertToImage() { // 点击按钮时重新绘制Canvas元素 html2canvas(this.$refs.content) .then(canvas => { const dataURL = canvas.toDataURL(); this.$refs.image.src = dataURL; }) } } } </script> ``` 此代码将一个div元素(使用ref="content"引用)转换为图像,并将其显示在一个img元素(使用ref="image"引用)中。在mounted钩子函数中,dom节点会立即被转换成canvas并渲染为图像。在convertToImage方法中,会在点击按钮时重新绘制Canvas元素。 3. 注意事项 使用这种方法将DOM节点转换为图像有一些注意事项: - 由于Canvas元素具有像素密度,因此可以通过设置宽度和高度属性来调整画布的分辨率。例如:canvas.width = 500,canvas.height = 500; - 转换为图像的DOM节点中不能包含跨域资源,否则不会渲染到Canvas中; - 转换DOM节点中的CSS可能会失效,在绘制到Canvas之前需要手动覆盖样式。 总之,通过安装html2canvas库,将DOM节点转换为Canvas元素,并使用toDataURL()方法将其转换为图像数据是可行的。需要注意的是,可能需要处理像素密度,跨域资源和CSS兼容性的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值