zoukankan      html  css  js  c++  java
  • vue项目vue页面内容生成图片并保存本地方案

    使用html2canvas插件 

    官网:http://html2canvas.hertzen.com/

    1、安装:

    npm install --save html2canvas

    2、在需要使用的vue组件中引入: 

    import html2canvas from "html2canvas"

    3、将制定区域内转成图片 

      添加ref标记

    <div class="container" ref="imageDom"></div>
    /**
    * 将页面指定节点内容转为图片 
    * 1.拿到想要转换为图片的内容节点DOM;    
    * 2.转换,拿到转换后的canvas    
    * 3.转换为图片
    */
    
    clickGeneratePicture() { //生成图片
        html2canvas(this.$refs.imageDom).then(canvas => {
            // 转成图片,生成图片地址
            this.imgUrl = canvas.toDataURL("image/png"); //可将 canvas 转为 base64 格式
        });
    }    

    4、创建隐藏的可下载链接  --- 必须同源(访问的网站域名与服务器域名一致)才能下载

    var eleLink = document.createElement("a");
    eleLink.href = this.imgUrl; // 转换后的图片地址
    eleLink.download = "历史曲线图";
    document.body.appendChild(eleLink);
    // 触发点击
    eleLink.click();
    // 然后移除
    document.body.removeChild(eleLink);

    5、不同源下载问题

    downloadIamge(imgsrc, name) {//下载图片地址和图片名
        var image = new Image();
        // 解决跨域 Canvas 污染问题
        image.setAttribute("crossOrigin", "anonymous");
        image.onload = function() {
            var canvas = document.createElement("canvas");
            canvas.width = image.width;
            canvas.height = image.height;
            var context = canvas.getContext("2d");
            context.drawImage(image, 0, 0, image.width, image.height);
            var url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
    
            var a = document.createElement("a"); // 生成一个a元素
            var event = new MouseEvent("click"); // 创建一个单击事件
            a.download = name || "photo"; // 设置图片名称
            a.href = url; // 将生成的URL设置为a.href属性
            a.dispatchEvent(event); // 触发a的单击事件
        };
        image.src = imgsrc;
    },
    downs(){
        this.downloadIamge(this.pic.url, 'pic')
    }

    ***页面有些内容不能在生成的图片内显示

    之所以能够生成图片,是因为将页面指定的内容DOM元素转成了canvas,在转换的时候,并不是所有的css属性都支持,比如:box-shadow, text-overflow:ellipsis等。
    因此,图片内容出现空白的时候,建议修改css表现样式。

    生成的canvas宽高大小,是否允许跨域图片等,读者可参考官方文档进行相应设置。
    生成的图片背景默认为白色,可以通过backgroundColor属性修改背景颜色,使用如下:

    html2canvas(this.$refs.imageDom, {
            backgroundColor: null // null 表示设置背景为透明色
    })

    踩坑见:http://caibaojian.com/h5-download.html

    亲采坑

     1、生成的图片有偏移,显示不完整,使用如下处理,好使

    share() {
            var width = $('.share')[0].offsetWidth; //dom宽
            var height = $('.share')[0].offsetHeight; //dom高
            // 解决图片模糊
            var scale = 2;//放大倍数
            var canvas = document.createElement('canvas');
            canvas.width = width * 2;
            canvas.height = height * 2;
            canvas.style.width = width + 'px';
            canvas.style.height = height + 'px';
            var context = canvas.getContext('2d');
            context.scale(scale, scale);
                    //设置context位置,值为相对于视窗的偏移量负值,让图片复位(解决偏移的重点)
                    var rect = $('.share').get(0).getBoundingClientRect();//获取元素相对于视察的偏移量
            context.translate(-rect.left, -rect.top);
     
            var opts = {
                canvas: canvas,
                useCORS: true, // 【重要】开启跨域配置
                scrollY: 0, // 纵向偏移量 写死0 可以避免滚动造成偶尔偏移的现象
            };
            html2canvas($(".share")[0], opts).then(canvas => {
                // 使用toDataURL方法将图像转换被base64编码的URL字符串
                var src = canvas.toDataURL();
                // 显示图片隐藏dom(图片生成后的操作)
                $('.share-wrap').addClass('hidden');
                $('.share-canvas').removeClass('hidden');
                $('.share-canvas').find('img').attr('src', src);
            });
    }

     2、报错:失败 - 网络错误

    1)quality值设置小一些 --无用

    使用 canvas.toDataURL('image/jpeg',1);可以对canvas导出内容做格式转换,如果导出的图片太大,可以将quality值设置小一些,0~1,1代表无损

    2)html转canvas,再用canvas输出为base64图片,base64通过url的data写法的方式实现下载。

    出现这个原因是生成的图片太大,接着生成的base64太长,超出了浏览器对于url的限制。
    具体看这个博客:URL传值问题,不同浏览器对URL的长度要求(https://blog.csdn.net/jierry_wang/article/details/6796654

    解决方法:换一种方式来下载图片。看了下canvas有几个方法,转url的是toDataURL,而toBlob就是解决方案。

    blob的文档可以参考一下这里:细说Web API中的Blob

     修改之后的代码如下:

    canvas.toBlob((blob)=>{
                let eleLink = document.createElement("a");
                eleLink.download = "监测数据图";
                eleLink.href = URL.createObjectURL(blob); // 转换后的图片地址
                document.body.appendChild(eleLink);
                // 触发点击
                eleLink.click();
                // 然后移除
                document.body.removeChild(eleLink);
                this.genLoading = false;
    },'image/png',1)

    不报错了,但是还是不行,,生成的图片依旧不完整,如下,,可能因为我的实在是太多了(153*3个图表)

     办法依然再找,,,先记录到这

  • 相关阅读:
    简易四则运算
    对GitHub的认识
    对‘前辈’们的博文有感
    javascript中的JSON序列化与反序列化
    初步体验javascript try catch机制
    JQuery拾遗
    直面Javascript面试题算法思路
    ECMAScript5下Array的方法
    浅谈javascript中的数据类型和引用类型
    ECMAScript 5.1中对属性的操作
  • 原文地址:https://www.cnblogs.com/slightFly/p/11828068.html
Copyright © 2011-2022 走看看