首页 > 其他分享 >将html元素保存为图片

将html元素保存为图片

时间:2024-10-14 11:34:21浏览次数:1  
标签:canvas scale 元素 保存 height width html let document

初始需求是echarts绘制的图表保存为图片,

后来发现,echarts图标之外,还有一个参数input/button也要放到图片中

于是,技术实现从简单的《echarts导出为图片》

变成了较为复杂的《html元素导出为图片》

 

先放出已经实现的《echarts导出为图片》的代码,

    // 导出 图片
    generatePic() {
      let parseTime = dayUtils.parseTime(new Date(), '');
      var myChart = document.getElementById('fitModel_echart_Option_Div_all')
      // var myChart = echarts.init(document.getElementById(this.showFitModel_pingjia_factor));
      var img = new Image();
      // pieMyChart1 要导出的图表
      img.src = myChart.getDataURL({
        type: "png",
        pixelRatio: 1, //放大2倍
        backgroundColor: "#000",
      });
      let projectName = this.projectInfo.projectName || ''
      projectName = '敏感性分析:' + projectName
      img.onload = function () {
        var canvas = document.createElement("canvas");
        canvas.width = img.width;
        canvas.height = img.height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0);
        var dataURL = canvas.toDataURL("image/png");
        var a = document.createElement("a");
        var event = new MouseEvent("click");
        a.download = projectName + "分析结果_图片" + parseTime + ".png" || "下载图片名称";
        // 将生成的URL设置为a.href属性
        a.href = dataURL;
        // 触发a的单击事件
        a.dispatchEvent(event);
        a.remove();
      };
    },
View Code

 

 

照抄的《html元素导出为图片》相关js代码

//获取canvas配置项
    getCanvasOption(shareContent){
      let canvasEle = document.querySelector('canvas');
      if(canvasEle){
        document.getElementById('dialog').removeChild(canvasEle)
      }
      let width = shareContent.offsetWidth; //获取dom 宽度
      let height = shareContent.offsetHeight; //获取dom 高度
      let canvas = document.createElement("canvas"); //创建一个canvas节点
      let scale = 2; //定义任意放大倍数 支持小数

      canvas.getContext("2d").scale(scale, scale); //获取context,设置scale 
      canvas.width = width * scale; //定义canvas 宽度 * 缩放
      canvas.height = height * scale; //定义canvas高度 *缩放

      canvas.style.cssText = 'width: '+ width +'px; height: '+ height +'px';
      let opts = {
          scale: scale, // 添加的scale 参数
          canvas: canvas, //自定义 canvas
          // logging: true, //日志开关,便于查看html2canvas的内部执行流程
          width: width, //dom 原始宽度
          height: height,
          useCORS: true // 【重要】开启跨域配置
      };
      return opts;
    },

     downloadFile(content, fileName) { //下载base64图片
      let base64ToBlob = function(code) {
        let parts = code.split(';base64,');
        let contentType = parts[0].split(':')[1];
        let raw = window.atob(parts[1]);
        let rawLength = raw.length;
        let uInt8Array = new Uint8Array(rawLength);
        for(let i = 0; i < rawLength; ++i) {
          uInt8Array[i] = raw.charCodeAt(i);
        }
        return new Blob([uInt8Array], {
          type: contentType
        });
      };
      let aLink = document.createElement('a');
      let blob = base64ToBlob(content); //new Blob([content]);
      let evt = document.createEvent("HTMLEvents");
      evt.initEvent("click", true, true); //initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
      aLink.download = fileName;
      aLink.href = URL.createObjectURL(blob);
      aLink.click();
    },

    //下载图片
    downLoadPic() {     
      let shareContent = document.getElementById('cert');//需要截图的包裹的(原生的)DOM 对象
      let opts = this.getCanvasOption(shareContent);
      this.html2canvas(shareContent,opts).then((canvas) =>{
        // document.getElementById('dialog').appendChild(canvas);
        let context = canvas.getContext('2d');
        // 【重要】关闭抗锯齿
        context.mozImageSmoothingEnabled = false;
        context.webkitImageSmoothingEnabled = false;
        context.msImageSmoothingEnabled = false;
        context.imageSmoothingEnabled = false;
        let MIME_TYPE = "image/png";
        let imgURL = canvas.toDataURL(MIME_TYPE);
        this.downloadFile(imgURL,'文件名')
      });
    },

    //下载pdf
    downLoadPdf() {
      let shareContent = document.getElementById('cert');//需要截图的包裹的(原生的)DOM 对象
      let opts = this.getCanvasOption(shareContent);
      this.html2canvas(shareContent,opts).then((canvas) =>{
        let contentWidth = canvas.width
        let contentHeight = canvas.height
        let pageHeight = contentWidth / 592.28 * 841.89
        let leftHeight = contentHeight
        let position = 0
        let imgWidth = 595.28
        let imgHeight = 592.28 / contentWidth * contentHeight
        let pageData = canvas.toDataURL('image/jpeg', 1.0)
        let PDF = new this.JsPDF('', 'pt', 'a4')
        if (leftHeight < pageHeight) {
          PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
        } else {
          while (leftHeight > 0) {
            PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
            leftHeight -= pageHeight
            position -= 841.89
            if (leftHeight > 0) {
              PDF.addPage()
            }
          }
        }
        PDF.save('文件名' + '.pdf')
      });
    },

 

标签:canvas,scale,元素,保存,height,width,html,let,document
From: https://www.cnblogs.com/difs/p/18463720

相关文章

  • codeforces round 977 (div.2) C2(访问set的第一个元素,观察数据规律-出现次序,用set记
    解题历程:我首先想到的是等效法,每一次操作可以等效为每次将第一个人抽出放入一组,后面的人往前移,而该组的人就是可以任意放置的人,当b中后面再出现与前一个相同的人时,就不进行操作,当b中出现不同的人时,就看看这组中有没有这个人,有的话就下一个循环,没有的话就看看这个新的人是否按a中......
  • QD1-P12 HTML常用标签:表格
    本节学习HTML常用标签:表格标签table‍本节视频www.bilibili.com/video/BV1n64y1U7oj?p=12‍知识点1表格的基本结构<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title>P12-表格标签</title> </head> <body> <!--......
  • 使用HTML和CSS实现3D波浪动画效果
    使用HTML和CSS实现3D波浪动画效果在本篇博客中,将详细介绍如何使用HTML与CSS创建一个3D波浪动画效果。这个效果不仅能够在网页中创建立体感强的视觉体验,还能够通过悬停和聚焦实现与用户的交互。我们将逐步解析代码中的每个部分,帮助你掌握其中的关键技巧。1.效果2.HTML......
  • Qt/C++音视频开发-多级连保存和推流设计
    Qt/C++音视频开发-多级连保存和推流设计介绍多级连保存和推流设计是一种将音视频内容同时保存到多个文件或推流到多个平台的技术。这种设计能够增加数据冗余、提高访问速度,确保数据安全性,并且可以实现同时在多个平台上进行直播,提高内容的覆盖面和用户体验。应用使用场景......
  • [LeetCode] 315. 计算右侧小于当前元素的个数
    题目描述:给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。题目链接:.-力扣(LeetCode)题目主要思路:其实跟“LCR170.交易逆序对的总数”那道题差不多,就是多了个数组来......
  • HTML(五)列表详解
    在HTML中,列表可以分为两种,一种为有序列表。另一种为无序列表今天就来详细讲解一下这两种列表如何实现,效果如何1.有序列表有序列表的标准格式如下:<ol><li>列表项一</li><li>列表项二</li></ol>这里的列表项可以随意更改内容,使用示例如下:<!DOCTYP......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript游戏网站(英雄联盟)
    HTML+CSS+JS【游戏网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 基于Java+Jsp+Html+MySQL实现的企业仓储管理系统设计与实现(源码+文档+部署视频)
    文章目录1.前言2.详细视频演示3.论文参考4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.选题推荐毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • HTML入门教程一口气讲完!(下)\^o^/
    HTML表单HTML 表单和输入HTML表单用于收集不同类型的用户输入。在线实例创建文本字段(Textfield)本例演示如何在HTML页面创建文本域。用户可以在文本域中写入文本。创建密码字段本例演示如何创建HTML的密码域。(在本页底端可以找到更多实例。)HTML表单......
  • 前端学习第四天笔记 函数 对象 math对象 Date对象 DOM概述 document对象的获取元素、
    文章目录函数函数的声明函数名的提升对象math对象Math.abs()Math.max()和Math.min()Math.floor()和Math.ceil()Math.random()Date对象Date.now()Date对象中的Get方法DOM概述节点节点树Node.nodeType属性document对象_方法/获取元素document.getElementsByTagName()do......