当前位置: 首页 > news >正文

WEB前端将指定DOM生成图片并下载最佳实践(html2canvas)

前言:

html2canvas 是一个 JavaScript 库,其主要作用是将 HTML 元素或其部分内容渲染为 Canvas 图像。通过它,开发者可以将网页中的任意 DOM 元素(包括文本、图片、样式等)转换为图片格式(如 PNG 或 JPEG),并进一步用于保存、分享或其他处理。

html2canvas 的使用:

安装html2canvas

npm install html2canvas --save

vue3示例:

完整代码:

<template><div><div class="image-box" ref="downloadRef"><div class="text">恭顺安康</div><img class="picture" src="@/assets/images/study-dog.png" alt="" /></div><el-button type="primary" plain @click="download">下载图片</el-button></div>
</template><script setup>
import { ref } from "vue";
import html2canvas from 'html2canvas'const downloadRef = ref();
const download = () => {html2canvas(downloadRef.value).then((canvas) => {let dataURL = canvas.toDataURL("image/png"); //base64格式的图片 url// 创建a标签下载图片var addElement = document.createElement("a");addElement.href = dataURL;addElement.download = "恭顺安康.png"; //设置下载的图片名称document.body.appendChild(addElement);addElement.click();document.body.removeChild(addElement);});
};
</script><style lang="less" scoped>
.image-box {width: 500px;height: 520px;border: 1px solid #ccc;background-color: aqua;display: flex;justify-content: center;align-items: center;flex-direction: column;font-weight: 700;font-size: 28px;margin-bottom: 10px;.text {color: #fff;margin-bottom: 10px;}.picture {width: 400px;height: 400px;}
}
</style>

效果演示:

 我们还可以将base64格式的图片转化成file或blob格式的图片,兼容性会更好一些。完整代码如下:

<template><div><div class="image-box" ref="downloadRef"><div class="text">恭顺安康</div><img class="picture" src="@/assets/images/study-dog.png" alt="" /></div><el-button type="primary" plain @click="download">下载图片</el-button></div>
</template><script setup>
import { ref } from "vue";
import html2canvas from "html2canvas";const downloadRef = ref();const dataURLtoBlob = (dataurl) => {var arr = dataurl.split(","); //分割为数组,分割到第一个逗号let bstr = window.atob(arr[1]);let n = bstr.length;let u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], { type: "png" });
};const download = () => {html2canvas(downloadRef.value).then((canvas) => {let dataURL = canvas.toDataURL("image/png"); //base64格式的图片 urlconst blobUrl = dataURLtoBlob(dataURL); //转化成blob格式的图片 Blob{size:xx,type:xx}var fileUrl = URL.createObjectURL(blobUrl); //URL.createObjectURL()创建一个指向File或Blob对象的URL。这个URL可以被用于指定一个HTML标签的href属性// 创建a标签下载图片var addElement = document.createElement("a");addElement.href = fileUrl;addElement.download = "恭顺安康.png";document.body.appendChild(addElement);addElement.click();document.body.removeChild(addElement);});
};
</script><style lang="less" scoped>
.image-box {width: 500px;height: 520px;border: 1px solid #ccc;background-color: aqua;display: flex;justify-content: center;align-items: center;flex-direction: column;font-weight: 700;font-size: 28px;margin-bottom: 10px;.text {color: #fff;margin-bottom: 10px;}.picture {width: 400px;height: 400px;}
}
</style>

效果同上~

拓展

html2canvas主要作用和应用场景?

主要作用

  1. 将 HTML 转换为图片

    • html2canvas 可以将网页中的特定区域或整个页面转换为图片,支持复杂的 CSS 样式(如渐变、阴影、边框等)。

    • 示例:将网页中的某个 <div> 元素转换为图片。

  2. 生成截图

    • 用于生成网页的截图,用户可以保存或分享这些截图。

    • 示例:生成网页的缩略图或用户自定义内容的截图。

  3. 保存网页内容

    • 将网页中的内容保存为图片格式,方便用户下载或分享。

    • 示例:用户点击“保存为图片”按钮,将网页内容保存为 PNG 文件。

  4. 实现网页打印功能

    • 将网页内容转换为图片后,可以用于打印或生成 PDF。

    • 示例:将网页中的表格或图表转换为图片并打印。

  5. 动态生成图片

    • 结合用户输入或动态数据,实时生成图片。

    • 示例:根据用户输入生成自定义海报或证书。

  6. 跨平台兼容

    • 在移动端和桌面端均可使用,支持主流浏览器。

    • 示例:在移动端生成分享图片。

使用场景 

  1. 网页截图工具

    用户可以通过点击按钮将网页内容保存为图片。
  2. 生成分享图片

    在社交媒体分享时,将网页内容转换为图片,方便传播。
  3. 数据可视化

    将图表、地图等可视化内容保存为图片。
  4. 网页内容存档

    将网页内容保存为图片格式,用于存档或备份。
  5. 自定义海报或证书

    根据用户输入动态生成图片,如活动海报、电子证书等。

为什么blob格式的图片会比base64格式的图片兼容性更好一些? 

Blob 格式的图片比 Base64 格式的图片兼容性更好,主要是因为它们在存储、传输和处理方式上的差异。以下是具体原因: 

1. 文件大小

  • Blob:Blob 是二进制数据,存储的是文件的原始二进制形式,因此文件大小与原始图片一致,不会额外增加体积。

  • Base64:Base64 是一种文本编码方式,它将二进制数据转换为 ASCII 字符串,会导致数据体积增加约 33%。这会增加内存占用和传输开销。

兼容性影响

  • 对于大图片或大量图片,Base64 会增加内存和网络负担,可能导致性能问题,而 Blob 则更高效。


2. 数据传输效率

  • Blob:Blob 是二进制数据,适合直接用于网络传输(如通过 fetch 或 XMLHttpRequest 上传或下载),传输效率高。

  • Base64:Base64 是文本格式,传输时需要额外的编码和解码步骤,效率较低。

兼容性影响

  • 在网络传输中,Blob 格式更高效,尤其是在移动端或网络环境较差的情况下。


3. 浏览器处理方式

  • Blob:Blob 是浏览器原生支持的二进制数据格式,可以直接用于图片渲染、文件下载等操作,兼容性更好。

  • Base64:Base64 需要浏览器额外解码为二进制数据后才能使用,增加了处理步骤。

兼容性影响

  • 在某些低版本浏览器或特殊环境中,Base64 可能会遇到解码问题,而 Blob 的支持更广泛。


4. 内存占用

  • Blob:Blob 是二进制数据,存储和渲染时占用的内存较少。

  • Base64:Base64 是文本格式,存储和渲染时会占用更多内存。

兼容性影响

  • 对于内存有限的设备(如移动端),Base64 可能导致内存不足或性能下降,而 Blob 更节省资源。


5. URL 使用

  • Blob:可以通过 URL.createObjectURL(blob) 生成一个临时 URL,直接用于图片渲染或文件下载。

  • Base64:Base64 数据可以直接嵌入到 src 属性中(如 data:image/png;base64,...),但会导致 HTML 或 CSS 文件体积增大。

兼容性影响

  • Base64 数据嵌入 HTML 或 CSS 中可能会导致文件过大,影响加载速度,而 Blob 的临时 URL 更灵活且高效。


6. 安全性

  • Blob:Blob 是二进制数据,不易被直接修改或注入恶意代码。

  • Base64:Base64 是文本格式,容易被篡改或注入恶意内容。

兼容性影响

  • 在安全性要求较高的场景中,Blob 更可靠。


7. API 支持

  • Blob:现代浏览器广泛支持 Blob,并且可以与 FileFileReaderFormData 等 API 无缝配合。

  • Base64:虽然 Base64 也被广泛支持,但在某些 API 中需要额外处理(如解码)。

兼容性影响

  • Blob 更适合与现代 Web API 结合使用,兼容性更好。

总结

特性Blob 格式Base64 格式
文件大小原始大小,无额外开销增加约 33% 的体积
传输效率高效,适合网络传输较低,需要编码和解码
内存占用较少较多
浏览器支持广泛支持,原生二进制格式需要额外解码
URL 使用生成临时 URL,灵活高效直接嵌入 HTML/CSS,可能导致文件过大
安全性较高,不易篡改较低,易被篡改
API 支持与现代 API 无缝配合需要额外处理

因此,Blob 格式的图片在文件大小、传输效率、内存占用、浏览器支持和安全性等方面表现更好,兼容性更强,尤其是在处理大文件或高性能要求的场景中。而 Base64 格式更适合用于小图片或需要直接嵌入文本的场景(如邮件或简单的数据存储)。

相关文章:

WEB前端将指定DOM生成图片并下载最佳实践(html2canvas)

前言&#xff1a; html2canvas 是一个 JavaScript 库&#xff0c;其主要作用是将 HTML 元素或其部分内容渲染为 Canvas 图像。通过它&#xff0c;开发者可以将网页中的任意 DOM 元素&#xff08;包括文本、图片、样式等&#xff09;转换为图片格式&#xff08;如 PNG 或 JPEG&…...

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者&#xff0c;在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践&#xff0c;帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …...

深度学习学习笔记(34周)

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…...

C++ 设计模式-备忘录模式

游戏存档实现&#xff0c;包括撤销/重做、持久化存储、版本控制和内存管理 #include <iostream> #include <memory> #include <deque> #include <stack> #include <chrono> #include <fstream> #include <sstream> #include <ct…...

TOGAF之架构标准规范-信息系统架构 | 应用架构

TOGAF是工业级的企业架构标准规范&#xff0c;信息系统架构阶段是由数据架构阶段以及应用架构阶段构成&#xff0c;本文主要描述信息系统架构阶段中的应用架构阶段。 如上所示&#xff0c;信息系统架构&#xff08;Information Systems Architectures&#xff09;在TOGAF标准规…...

第一届网谷杯

统计四场的所有题目&#xff08;共计12题&#xff0c;四场比赛一共上了21题【包括换题】&#xff09; 随便记记&#xff0c;以免老题复用&#xff08;已经复用了&#xff09; Web 文件包含 1 伪协议 http://120.202.175.143:8011/?cphp://filter/convert.base64-encode/reso…...

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…...

mysql -DQL语句和DCL语句

DQL 数据查询语言&#xff08;Data Query Language&#xff0c;DQL&#xff09;是数据库操作语言的重要组成部分&#xff0c;主要用于从数据库中检索数据&#xff0c;核心关键字为SELECT。以下从语法结构、常见操作及示例等方面详细介绍&#xff1a; 语法结构 DQL 的标准语法…...

掌握 ElasticSearch 组合查询:Bool Query 详解与实践

掌握 ElasticSearch 组合查询&#xff1a;Bool Query 详解与实践 一、引言 (Introduction)二、Bool 查询基础2.1 什么是 Bool 查询&#xff1f;2.2 Bool 查询的四种子句2.3 语法结构 三、Bool 查询的四种子句详解与示例3.1 must 子句3.2 filter 子句3.3 should 子句3.4 must_no…...

C++ 类和对象(友元、内部类、匿名对像)

目录 一、前言 二、正文 1.友元 1.1友元函数的使用 1.1.1外部友元函数可访问类的私有成员&#xff0c;友员函数仅仅是一种声明&#xff0c;他不是类的成员函数。 1.1.2一个函数可以是多个类的友元函数 2.友元类的使用 2.1什么是友元类 2.2 友元类的关系是单向的&#x…...

PostgreSQL 常用函数

PostgreSQL 常用函数 在数据库管理系统中&#xff0c;函数是执行特定任务的基本构建块。PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;提供了丰富的内置函数&#xff0c;这些函数极大地增强了数据库操作的能力。以下是一些在 PostgreSQL 中常用的函数&#…...

掌握 ElasticSearch 四种match查询的原理与应用

文章目录 一、引言 (Introduction)二、准备工作&#xff1a;创建索引和添加示例数据三、match 查询四、match_all 查询五、multi_match 查询六、match_phrase 查询七、总结 (Conclusion) 一、引言 (Introduction) 在信息爆炸的时代&#xff0c;快速准确地找到所需信息至关重要…...

解决:Conda虚拟环境中未设置CUDA_HOME的问题

背景&#xff1a;我是Ubuntu22.04系统&#xff0c;最近在复现FoundationPose算法&#xff0c;按照README构建部署环境时&#xff0c;有一步一直卡住&#xff0c;看了下是未找到CUDA_HOME这个环境变量。 网上搜了下这个错误&#xff0c;需要设置CUDA_HOME的环境变量路径&#x…...

easyexcel和poi同时存在版本问题,使用easyexcel导出excel设置日期格式

这两天在使用easyexcel导出excel的时候日期格式全都是字符串导致导出的excel列无法筛选 后来调整了一下终于弄好了&#xff0c;看一下最终效果 这里涉及到easyexcel和poi版本冲突的问题&#xff0c;一直没搞定&#xff0c;最后狠下心来把所有的都升级到了最新版&#xff0c;然…...

HarmonyOS 开发套件 介绍——下篇

HarmonyOS 开发套件 介绍——下篇 在HarmonyOS的生态中&#xff0c;开发套件作为支撑整个系统发展的基石&#xff0c;为开发者提供了丰富而强大的工具和服务。本文将深入继续介绍HarmonyOS SDK、ArkCompiler、DevEco Testing、AppGallery等核心组件&#xff0c;帮助开发者全面掌…...

关于order by的sql注入实验

实验描述 本实验基于sqli-lab的第46关进行测试 本关的sql 语句为$sql "SELECT * FROM users ORDER BY $id" 利用sort进行sql注入&#xff0c;我们可以利用报错注入&#xff0c;延时注入来爆出数据 1.报错注入 1.手工测试 爆出数据库 ?sort(extractvalue(1, c…...

Transformers快速入门-学习笔记

一、自然语言处理 NLP 是借助计算机技术研究人类语言的科学自然语言处理发展史 一、不懂语法怎么理解语言 依靠语言学家人工总结文法规则 Chomsky Formal Languages 难点&#xff1a;上下文有关文法 规则增多&#xff0c;存在矛盾 二、只要看得足够多&#xff0c;就能处理语言…...

luci界面开发中的MVC架构——LuCI介绍(二)

想要给openwrt开发应用&#xff0c;虽然直接可执行程序也可以运行&#xff0c;但是没有UI会很不方便&#xff0c;想要开发UI就要用openwrt的那一套&#xff0c;自然就是LuCI&#xff0c;LuCI又用了一套MVC框架&#xff0c;今天就讲讲这是个什么东西。 OpenWrt LuCI 界面开发中…...

第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库

这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景&#xff0c;其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。 1.10.1 文档数据库 文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据&#xff0c;而不是采用僵硬的行…...

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用&#xff1a;生成结构化PPT大纲&#xff08;擅长逻辑构建与内容优化&#xff09;Kimi核心作用&#xff1a;将文本转换为视觉化PPT&#xff08;提供模板库与排版引擎&#xff09; 二、操作步骤详解 1. 通…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...