• 移动端vue使用html2canvas的一些问题


    1、业务需求:用户投保时保存全页面截图

    2、截图插件:html2canvas

      使用npm或yarn(可以使用淘宝镜像)

    npm install html2canvas
    yarn add html2canvas

      在需要的页面引入html2canvas

    import html2canvas from 'html2canvas'

      直接上代码

    <div ref="imageTofile">
        <!-- 页面内容 -->
    </div>
    
    <script>
    import html2canvas from "html2canvas";
    
    export default {
      data() {
        return {
          ...
        }
      },
      methods: {
        // 全屏截图
        imgDownload() {
          let _that = this;
          // 获取需下载范围元素
          let img = this.$refs.imageTofile;
          // 图片高度
          var w = parseInt(window.getComputedStyle(img).width);
          // 图片宽度
          var h = parseInt(window.getComputedStyle(img).height);
    
          // 声明画布宽高
          let canvas = document.createElement("canvas");
          canvas.width = w;
          canvas.height = h;
          canvas.style.width = w + "px";
          canvas.style.height = h + "px";
          // 利用 html2canvas 下载 canvas
          html2canvas(img, {
            canvas: canvas,
            useCORS: true, // 如果页面有跨域的图片,需要加上这个
            scrollY: 0
          }).then(function(canvas) {
            let photoUrl = canvas.toDataURL(); // base64图片地址
            let conversions = _that.base64ToBlob(photoUrl, "image/png");
            window.URL = window.URL || window.webkitURL; // blob对象转换为blob-url
            let url = window.URL.createObjectURL(conversions);
            console.log(url); // 图片路径 blob格式,主要是base64的图片格式太长,防止浏览器的url长度限制。
          });
        },
        base64ToBlob(urlData, type) {
          let arr = urlData.split(",");
          let mime = arr[0].match(/:(.*?);/)[1] || type;
          // 去掉url的头,并转化为byte
          let bytes = window.atob(arr[1]);
          // 处理异常,将ascii码小于0的转换为大于0
          let ab = new ArrayBuffer(bytes.length);
          // 生成视图(直接针对内存):8位无符号整数,长度1个字节
          let ia = new Uint8Array(ab);
          for (let i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
          }
          return new Blob([ab], {
            type: mime
          });
        }
      }
    }
    
    </script>

      乍看一下好像没啥问题,实际操作你会发现以下几个问题

      1、白屏,只截到一部分

      

      这个问题是页面滚动的原因,导致截图白屏,解决方案就是截图之前跳到顶部

    document.documentElement.scrollTop = 0;
    document.body.scrollTop = 0;

      2、页面宽高比例导致的截图只截了一部分

      

      这种情况是宽高比例的原因导致,解决方法是调整宽高的比例

    // 声明画布宽高
    let canvas = document.createElement("canvas");
    canvas.width = w * 4; // 乘了一个倍率
    canvas.height = h * 3.; // 乘了一个倍率
    canvas.style.width = w + "px";
    canvas.style.height = h + "px";
    // 可能跟html5canvas的canvas的初始大小有关,这个倍率跟实际页面的宽高有关

    我的页面宽高是414*1946,具体是多少,需要去试。
    如果大家有更好的方法,希望给我说一下

      

      

  • 相关阅读:
    C#.NET 超大文件上传和断点续传的实现
    Linux下arp用法
    daf简记
    Linux route命令详解和使用示例(查看和操作IP路由表)
    CMake使用之一
    Crontab的格式
    linux 单网卡绑定两个ip
    云计算与虚拟化以及IaaS, PaaS和SaaS
    shell中判断用法
    解决screen Cannot open your terminal '/dev/pts/1'问题
  • 原文地址:https://www.cnblogs.com/wangjishu/p/13292060.html
Copyright © 2020-2023  润新知