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个图表)

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

原文地址:https://www.cnblogs.com/slightFly/p/11828068.html