VUE

在Vue项目中使用html2canvas生成页面截图并上传

安装 html2canvas

<!-- 把需要生成截图的元素放在一个元素容器里,设置一个ref -->
<div class="image_tofile" ref="imageTofile">
  <!-- 这里放需要截图的元素,自定义组件元素也可以 -->
</div>
<!-- 如果需要展示截取的图片,给一个img标签 -->
<img :src="htmlUrl">

VUE代码

// 引入html2canvas

import html2canvas from 'html2canvas'

// 注册组件

data() {
  return {
    htmlUrl: ''
  }
},
components: {
  html2canvas
},
methods: {
  // 页面元素转图片
  toImage() {
    // 第一个参数是需要生成截图的元素,第二个是自己需要配置的参数,宽高等
    html2canvas(this.$refs.imageTofile, {
      backgroundColor: null
    }).then((canvas) => {
      let url = canvas.toDataURL('image/png');
      this.htmlUrl = url;
      // 把生成的base64位图片上传到服务器,生成在线图片地址
      this.sendUrl();
    })
  },
  // 图片上传服务器
  sendUrl () {
    // 如果图片需要formData格式,就自己组装一下,主要看后台需要什么参数
      // const formData = new FormData()
    // formData.append('base64', this.company.fileUrl)
    // formData.append('userId', 123)
    // formData.append('pathName', 'pdf')
    this.$ajax({
      url: apiPath.common.uploadBase,
      method: 'post',
      data: this.htmlUrl
    }).then(res => {
      if (res.code && res.data) {
 
      }
    })
  }
}

但是上面的写法只能截取Html画面的一般控件,假如我们需要截取video标签画面的话,这个写法就不行了。video截图的话,可以用下面的写法。注意video标签中要加上 crossorigin=”Anonymous”, 否则会出错。

<template>
  <div class="hello">
   <button @click="toImage">截图</button>
   <div >
    <video id="video1"  width="550" controls=true src='http://xxx:8888/xxx.mp4' preload="metadata" crossorigin="Anonymous"></video> 
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      htmlUrl: ''
    };
  },

  methods: {

      // 页面元素转图片
      toImage() {
            var video = document.getElementById("video1");
            var canvas = document.createElement("canvas");
            canvas.width = video.videoWidth * 1;
            canvas.height = video.videoHeight * 1;
            canvas.getContext('2d')
                .drawImage(video, 0, 0, canvas.width, canvas.height);
            this.htmlUrl = canvas.toDataURL('image/png');
  },
  },
};
</script>