前端-导出png,jpg,pptx,svg

news/2025/2/13 12:45:57/

两款比较主流的截图工具 

特性dom-to-imagehtml2canvas
体积几 KB几十 KB
速度非常快较慢
浏览器兼容性与所有现代浏览器兼容与部分浏览器兼容性较差
跨域截图不支持支持
自定义截图区域不支持支持
CSS 属性支持不支持某些 CSS 属性支持所有 CSS 属性

dom-to-image该库自 2020 年后基本处于维护状态,更新频率较低。这意味着它可能不会再添加新的功能,更多是对现有问题进行修复。 html-to-image:html-to-image是dom-to-image的一个分支,它继承了dom-to-image的核心功能,并且持续保持更新。开发者会不断添加新特性、优化性能和修复已知问题,社区活跃度相对较高。 

安装与引用

//安装

npm install html2canvas

//引入

import html2canvas from 'html2canvas'; 

 //安装

npm install html-to-image

//引入

import * as htmlToImage from 'html-to-image';

import { toPng, toJpeg, toBlob, toPixelData, toSvg } from 'html-to-image';

htmlToImage主要的方法有:

htmlToImage.toPng(…);将节点转化为png格式的图片

htmlToImage.toJpeg(…);将节点转化为jpg格式的图片

htmlToImage.toSvg(…);将节点转化为svg格式的图片,生成的图片的格式都是base64格式 htmlToImage.toBlob(…);将节点转化为二进制格式,这个可以直接将图片下载 htmlToImage.toPixelData(…);获取原始像素值,以Uint8Array 数组的形式返回,每4个数组元素表示一个像素点,即rgba值。这个方法也是挺实用的,可以用于WebGL中编写着色器颜色。

htmlToImage主要的属性有:

filter : 过滤器节点中默写不需要的节点;

bgcolor : 图片背景颜色;

height, width : 图片宽高;

style :传入节点的样式,可以是任何有效的样式;

quality : 图片的质量,也就是清晰度;//jpeg

cacheBust : 将时间戳加入到图片的url中,相当于添加新的图片;

imagePlaceholder : 图片生成失败时,在图片上面的提示,相当于img标签的alt; 

1.img-(png,jpg)

  • JPG:其完整名称是 Joint Photographic Experts Group,它实际上指的是由该专家小组制定的一种图像压缩标准。不过在日常生活和技术领域中,人们习惯用 “JPEG” 来表示采用此标准压缩的图像文件,并且文件扩展名常写成 “.jpg” 或者 “.jpeg”。该标准非常适合用于存储照片和色彩丰富的图像,因为它能在一定程度上平衡图像质量和文件大小。
  • PNG:全称为 Portable Network Graphics,即便携式网络图形。它是作为替代 GIF 格式而开发的一种图像文件格式,支持无损数据压缩。PNG 格式在网页设计、图形设计以及需要透明背景效果的场景中应用广泛,因为它不仅能保证图像质量,还能实现良好的透明效果。

示例(react+ant-design):

  const menuProps = {

    items: exportFormat.map(item => ({

      ...item,

      onClick: () => handleClick(item)

    }))

  }

①利用html2canvas

png,jpg核心:使用 html2canvas 将 <div> 渲染为 Canvas,然后导出为图片。

利用html2canvas转换: 

JavaScript 库,可以将 DOM 元素渲染为 Canvas。它通过遍历 DOM 树,将每个元素的样式和内容绘制到 Canvas 上。

javascript">if (['jpg', 'png'].includes(item.label)) {let canvas=await  html2canvas(post.current)//将 Canvas 的内容转换为 Base64 编码的图像数据 URL。const image = canvas.toDataURL(`img/${item.label}`)//创建一个 <a> 标签,设置其 href 为图像数据 URL,并触发点击事件来实现文件下载。const link = document.createElement('a')link.href = imagelink.download = `post.${item.label}`link.click()}
②利用dom-to-image
javascript">    if (['jpg', 'png'].includes(item.label)) {const image = item.label === 'png' ? await htmlToImage.toPng(post.current, { bgcolor: 'white' }) : await htmlToImage.toJpeg(post.current, { quality: 0.95, bgcolor: 'white' });const link = document.createElement('a');link.href = image;link.download = `post.${item.label}`;link.click();}

 2.pptx

//安装

npm install pptxgenjs

//引用

import PptxGenJS from 'pptxgenjs';

javascript">if (['pptx'].includes(item.label)) {console.log(222);//利用html2canvasconst canvas = await html2canvas(post.current);//将 Canvas 的内容转换为 Base64 编码的图像数据 URL。const image = canvas.toDataURL('image/png');//方法1//利用dom-to-imageconst image=await htmlToImage.toPng(post.current)//方法2const pptx = new PptxGenJS();// 添加一张幻灯片const slide = pptx.addSlide();//x/y:距离幻灯片左边/右边的距离//w/h:图片的大小 单位都为英寸slide.addImage({ data: image, x: 1, y: 1, w: 4.5, h: 3 });pptx.writeFile({ fileName: 'post.pptx' });}

3.svg

html-to-image 的核心技术是利用SVG的 <foreignObject> 标签,将DOM节点嵌入到SVG中,然后将其转换为图像格式。

javascript">    if (item.label === 'svg') {// 获取 SVG 字符串-DataUrl形式const svgString = await htmlToImage.toSvg(post.current);// 提取并解码 URL 编码的 SVG 内容const svgContent = decodeURIComponent(svgString.split(',')[1]);// 创建 Blob 对象const blob = new Blob([svgContent], { type: 'image/svg+xml' });const url = URL.createObjectURL(blob);// 创建下载链接const link = document.createElement('a');link.href = url;link.download = 'post.svg';link.click();// 释放 URL 对象URL.revokeObjectURL(url);}

如果直接就是svg而不是dom元素:

javascript"> const svgElement = post.current.querySelector('svg');const serializer = new XMLSerializer();const svgString = serializer.serializeToString(svgElement);const blob = new Blob([svgString], { type: 'image/svg+xml' });const url = URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = 'post.svg';link.click();URL.revokeObjectURL(url);

无论是哪种方式,需要注意的是:

在将DOM元素导出为SVG时,直接使用XMLSerializerdom-to-image等工具通常不会保留CSS样式,因为这些工具主要关注的是DOM结构和内联样式。为了确保导出的SVG包含CSS样式,您可以采取以下方法:

javascript">  function inlineStyles(element) {const computedStyle = window.getComputedStyle(element);console.log(computedStyle);for (let i = 0; i < computedStyle.length; i++) {const property = computedStyle[i];element.style.setProperty(property, computedStyle.getPropertyValue(property));}// 递归处理子元素element.childNodes.forEach(child => {if (child.nodeType === Node.ELEMENT_NODE) {inlineStyles(child);}});}// 对内联 SVG 元素及其 <foreignObject> 内的元素应用内联样式inlineStyles(svgElement);

 


http://www.ppmy.cn/news/1571706.html

相关文章

基于离散小波变换的深度学习神经网络在肝细胞癌自动超声成像中的应用| 文献速递-医学影像人工智能进展

Title 题目 Automated ultrasonography of hepatocellular carcinoma using discrete wavelet transform based deep-learning neural network 基于离散小波变换的深度学习神经网络在肝细胞癌自动超声成像中的应用 01 文献速递介绍 全球健康挑战&#xff1a;肝细胞癌的诊断…

从零搭建:Canal实时数据管道打通MySQL与Elasticsearch

Canal实时同步Mysql Binlog至 Elasticsearch 文章目录 Canal实时同步Mysql **Binlog**至**Elasticsearch** 一. 环境准备1.环境检查检查Mysql是否开启BinLog开启Mysql BinlogJava环境检查 2.新建测试库和表3.新建Es索引 二.**部署 Canal Server****2.1 解压安装包****2.2 配置 …

全排列(力扣46)

这道题让我们求这个集合有多少种排列方式&#xff0c;那么与之前组合问题的不同就在于要考虑元素之间的顺序了&#xff0c;所以每一层递归的or循环的起始值无需变量控制&#xff0c;都从0开始。但是一个排列中不能出现相同元素&#xff0c;所以别忘了去重&#xff0c;这里的去重…

在 Vue 项目中使用 SQLite 数据库的基础应用

目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm&#xff1a;确保已安装 Node.js 和 npm。 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个…

java进阶之并发编程一ReentrantLock的实际应用和线程中断EXAMPLE

引言:继上一篇ReentrantLock的介绍来做俩个小demo。 实现3个线程分别打印指定数字和线程死锁进行线程中断。 上一篇:<<java进阶之并发编程一ReentrantLock同步锁的学习和syncthronized的区别>> **demo1:**ReentrantLock搭配三个线程分别打印指定的数字,直接上代…

Android Studio设置增量build

Android Studio设置build时只build新增的代码 而不是build全部代码&#xff0c;从而提高build速度

疯狂前端面试题(二)

一、Webpack的理解 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。Webpack 能够将各种资源&#xff08;JavaScript、CSS、图片、字体等&#xff09;视为模块&#xff0c;并通过依赖关系图将这些模块打包成一个或多个最终的输出文件&#xff08;通常是一个或几个…

Linux: 调整套接字缓冲区大小相关内核参数

Linux: 调整套接字缓冲区大小相关内核参数 内核参数关于套接字缓冲区大小相关的设置&#xff0c;这些参数控制了TCP和UDP套接字的接收和发送缓冲区的最大值、默认值以及动态调整范围。 当前配置 net.core.rmem_max 212992 # 最大接收缓冲区大小&#xff08;字节&#…