将html元素保存为图片

news/2024/10/14 11:35:11

初始需求是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 = '敏感性分析:' + projectNameimg.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.widthlet contentHeight = canvas.heightlet pageHeight = contentWidth / 592.28 * 841.89let leftHeight = contentHeightlet position = 0let imgWidth = 595.28let imgHeight = 592.28 / contentWidth * contentHeightlet 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 -= pageHeightposition -= 841.89if (leftHeight > 0) {PDF.addPage()}}}PDF.save('文件名' + '.pdf')});},

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第十期机器学习基础 02注意力机制和Transformer/Bert

一:注意力机制 (一)前提背景 1.人类的选择性视觉注意力 视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信…

查找大量时序遥感文件缺失、不连贯的成像日期:Python代码

本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计、列出未下载影像所对应的时相的方法~本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文…

AI智能照片放大软件--Topaz Gigapixel AI macOS苹果电脑安装包(含激活秘钥)

Topaz Gigapixel AI是一款功能强大的图像无损放大工具,具有以下功能特色:首先,它利用人工智能技术,能自动识别并增强图像中的细节,包括纹理、边缘等,同时减少噪声,使图像更加清晰细腻。其次,软件支持超高放大倍率,最高可达600%,且放大后的图像质量依然保持优秀。此外…

四、Spring Boot集成Spring Security之认证流程

Spring Security详细认证过程:包括登录时每个过滤器处理流程及业务处理和登出时每个过滤器处理流程及业务处理二、概要说明本文主要介绍登录登出业务流程,所以使用基于内存的用户名密码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权 如何查看基于内存的默认…

IT产品自动化解决方案【Sakura Automation Platform】助力研发团队高效完成工作

Sakura Automation Platform 是一站式持续自动化平台,涵盖 APP自动化、WEB自动化、API接口自动化、性能自动化,并且支持分布式测试,全面兼容 Appium、Selenium、Rest Assured、JMeter 等主流开源框架,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试,加速…

idea 自动添加注释 (方法+类 带参数/返回值)

1.类自动注释左上角选择 File -> Settings -> Editor -> File and Code Templates,选择Files -> Class,在类声明上填入以下内容,并勾选Enable Live Templates 开启此模板其中${}为变量,可以使用默认自带的变量,在Description中有详细的列举,如果是自定义的变…

前端未解决的问题记录

苹果手机中文符号旋转问题 <view class="right-area"><view style="--i:0"><text class="fix-label">功德主</text><text><text class="rotate-90">【</text>{{ order.initiator }}<tex…

突发:宕机崩溃OOM

突发:宕机崩溃OOM事故背景:我们的项目每年都进行一次三级等保认证,2024年*月*日认证公司对我们的项目进行渗透测试时,我们系统出现无法访问和使用的情况。出现问题后我们联系认证公司停止测试,系统依然没有恢复。 事故分析: 1. 出现问题后我第一时间检查了日志,发现了OO…