关于 html2canvas 将HTML导出图片

news2025/1/16 17:55:42

最近我看到了一篇关于如何解决 HTML2Canvas 导出图片模糊的问题的博客。在过去的项目中,我也使用过 HTML2Canvas 插件将活动页面导出为图片,并且好像也遇到了类似的问题,尽管记忆已经有些模糊了。今天我想仔细研究一下这个问题的原因。

在网上可以找到很多关于 HTML2Canvas 导出图片模糊的问题的讨论,结果发现大部分博客提供的解决方案都是相同的,即通过对 Canvas 的尺寸进行比例放大然后再缩小来解决。但实际上,我并不理解这样的操作究竟是如何使图片变得更清晰的。

首先,我们需要了解一些相关的知识。

设备像素比 devicePixelRatio

devicePixelRatio = 物理像素 / 设备独立像素 (也就是一个css像素)

  • 设备物理像素:是一个物理概念,比如设备的分辨率;例如Mac的 在这里插入图片描述

  • 设备独立像素 dips:代表可以通过程序控制使用的虚拟像素,是一个总体概念,包括了CSS像素,所以前端把它当做CSS逻辑像素理解 在这里插入图片描述

  • css像素:指的是CSS中使用的逻辑像素。px是一个相对单位,相对的是设备物理像素。例如刚才的设备独立像素设置为了 1440 * 900, 那么你的浏览器宽度就是 1440px

css像素和物理像素的关系: devicePixelRatio = 物理像素 / 设备独立像素 (也就是一个css像素等于 devicePixelRatio 个物理像素,可以想象的到,如果 devicePixelRatio 越高那么你的页面更清楚,像素的密度越大可以展示的细节就越多
在这里插入图片描述
通过上面三个概念就可以知道,设备的 devicePixelRatio 越高,通常情况下页面会更清晰。这是因为较高的 devicePixelRatio 意味着设备具有更高的像素密度,可以显示更多的像素在同样的物理尺寸上。

当 devicePixelRatio 较高时,浏览器会在渲染网页时使用更多的物理像素来显示每个 CSS 像素,从而提供更高的图像质量和更细腻的显示效果。这可以使文本、图像和其他元素的细节更加清晰、锐利,并且减少了马赛克或锯齿状的外观。

那么在 htmlcanvas2 里面导出图片为什么模糊呢;

我们要知道当图片的 CSS 宽度大于其实际宽度时,浏览器会对图像进行拉伸或缩放以适应所设置的 CSS 尺寸。这种情况下,如果图片被拉伸得过分,可能会导致图像像素被拉伸到不同大小的像素格上,从而使图像变得模糊。

我是不太理解为什么下面这种操作就可以让图片变得高清

const domObj = document.getElementById(dom);
  const canvas = document.createElement('canvas');
  // 获取设备dpi
  const dpi = devicePixelRatio > 1 ? devicePixelRatio : 1;
  // 获取dom原宽高
  const width = parseInt(domObj.offsetWidth, 10);
  const height = parseInt(domObj.offsetHeight, 10);
  // 调整画布大小
  canvas.width = dpi * width;
  canvas.height = dpi * height;
  canvas.style.width = width + 'px';
  canvas.style.height = height + 'px';
  const ctx = canvas.getContext('2d');
  // 放大画布
  ctx.scale(dpi, dpi);

在这里他首先将画布的width设置为了放大,然后又通过 scale 放大了 ,这里一系列的放大难道就可以让图片清晰吗?
举个🌰:浏览器的 dpr 如果是 2 你就在再放大 1css像素也只能放下 2物理像素。如果两张图片分别是1080x500和2160x1000,并且以相同的CSS尺寸(例如宽度为500像素)显示,那么浏览器会将这两张图片都缩放到相同的CSS尺寸来显示。因此,无论图片的原始分辨率如何,它们被缩放到相同的CSS尺寸后,它们的清晰度是相同的。所以,只用通过 html2canvas 导出图片即可。它自己会缩放对应的 dpr,当然宽高可能需要注意一下。

所以我们只要将画布放大对应的 dpr 倍数就可以

参考文档

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

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

相关文章

计系(2)复习

期末了,就是看书有点看不进去。所以我想着打字打出来吧,应该能看进去一些。 目录 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第六章 存储器层次结构 第七章 链接 第一章 计算机系统漫游 1.2 程序被其他程序翻译成不…

信道特性(通信原理)

信道模型:信道模型的相关知识用信息理论与编码的知识来进行学习。 信道的分类:根据通信信道一般性来划分。 信道的噪声也是值得探究的一个学习点,感兴趣的可以进行查找。 根据信道输入/输出信号在时间和幅值上的离散或连续来划分如下&#…

【刷题笔记】牛客网:链表指定区间内反转

【刷题笔记】牛客网:链表指定区间内反转 一、题目描述及示例 二、思路分析 1、首先,我们来定义一个虚拟的头节点tempHead(原因:如果从第一个位置开始反转,则可以不用进行特殊情况考虑),并使te…

chatgpt赋能python:PythonGCD:介绍与计算方法

Python GCD:介绍与计算方法 Python是一种流行的编程语言,它在计算数学问题时也非常实用。其中一个基本的数学问题就是计算两个或多个数的最大公约数(GCD)。Python的math库提供了计算GCD的方法,但我们也可以编写我们自…

13.STM32F103C8使用PSRAM64H外扩RAM空间

一、简介 最近在调试STM32F103C8驱动墨水屏的实验,在使用过程中,需要使用大内存的RAM需要,由于C8T6的RAM空间只有20KB,而墨水屏的需要的内存为800*480*2/893.75KB。 在网上查了相关的方案,都是使用STM32F103ZE外扩IS6…

基于模拟退火算法的旅行商问题优化(matlab程序)

0.代码链接 基于模拟退火算法的旅行商问题优化(matlab程序)资源-CSDN文库 1.简述 金属退火是将金属加热到一定温度,保持足够时间,然后以适宜速度冷却(通常是缓慢冷却,有时是控制冷却)的一种金属热处理工艺。模拟退…

ubuntu22.04安装atlas2.0.0

这是本人《数据治理》课程的课程实验,对本人来说非常具有挑战性。 环境: 1、Apache Atlas 2.0 2、JDK 1.8.0_251 3、Maven 3.6.3 因为是课程作业,不用于生产。使用Atlas内嵌Hbase与Solr的部署方式。 在ubuntu裸机上安装,裸机未安装java&#…

ChatGPT | Word表格整体输出

本文来自欧巴Godwin的博客 ,引用必须注明出处! 用LangChain读取Word和PDF的文字内容是好的,但如果内容包含表格则读取出来的内容完全没法看。用ChatGPT往往是做企业知识库,所以会出现一个场景,即员工想让ChatGPT讲解包…

2、数据库操作语句:多表查询(表employ、department、location)

目录 1、多表查询连接条件 1)在employ、department两张表中查询 2)若查询语句中出现了多个表中都存在的字段,必须指明此字段所在的表。 3)如果表名比较长,SQL语句中多次使用表名,可以给表起别名&#xf…

chatgpt赋能python:Python实现Fibonacci数列

Python实现Fibonacci数列 Fibonacci数列是一个非常经典的数列,定义如下: F ( 0 ) 0 , F ( 1 ) 1 F(0)0, F(1)1 F(0)0,F(1)1 F ( n ) F ( n − 1 ) F ( n − 2 ) F(n)F(n-1)F(n-2) F(n)F(n−1)F(n−2) 也就是说,第n个数等于前两个数之和…

开环模块化多电平换流器仿真(MMC)N=6

模型简介: 运行环境MATLAB2021a 开环模块化多电平换流器仿真(MMC)N=6,连接负载,采用载波移相调制。 可以得到换流器输出N+1=7电平的相电压波形。可考虑线路阻抗。 子模块采用半桥结…

chatgpt赋能python:用Python实现网络工具——Ping

用Python实现网络工具——Ping 网络是现代社会不可或缺的一部分,而网络工具也是每个程序员的必备技能之一。其中,Ping是最常用的网络工具之一,主要用于测试两台计算机之间的网络连接质量。今天,我们将着重讨论如何用Python实现Pi…

【初识C语言(5)】C语言关键字+define定义常量和宏

文章目录 1. 常见关键字2. 关键字 typedef3. 关键字 static3.1 修饰局部变量3.2 修饰全局变量3.3 修饰函数 4. define 定义常量和宏 1. 常见关键字 C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。 这里先主要…

SD/StableDiffusion模型,ai绘画部署教程,谷歌云端零成本部署,支持中文

目录 前言 准备前提 说明 开始搭建 1、第一步,下载ipynb脚本文件 2、第二步,上传一键脚本文件到谷歌云盘 3、选择该.ipynb文件--右键--打开方式--关联更多应用 4、输入框搜索Colaboratory找到该应用,安装 5、安装过程中,…

chatgpt赋能python:Python的pow()函数-实现快速幂运算

Python的pow()函数 - 实现快速幂运算 Python是一门高级编程语言,具有简单易学、功能强大、代码可读性高等特点。在Python的内置函数中,有一个很有用的函数叫做pow()。pow()函数可以对数字进行快速幂运算,其实现方法很简单,但是在…

chatgpt赋能python:Python画轨迹图:认识、用法与优势

Python画轨迹图: 认识、用法与优势 Python的数据可视化能力十分强大。画图工具虽然千千万,但其中,轨迹图是同时准确又美观的图形表现。本文将向读者介绍Python画轨迹图的好处、如何使用以及如何在项目合适的地方使用轨迹图。 了解Python轨迹图 为了更…

chatgpt赋能python:Python绘制波浪线教程

Python绘制波浪线教程 Python是一种高级编程语言,它广泛应用于各种领域,如数据分析、Web开发、自动化操作以及人工智能等等。在这篇文章中,我们将介绍如何使用Python来绘制漂亮的波浪线。 简介 绘制波浪线是一种在艺术设计、信息图表、数据…

MySQL压测实战

写作目的 最近看到一句话是MySQL的TPS是4000,这句话是不严谨的,因为没有说服务器的配置。所以自己买了个服务器做了一个压测。希望自己对数据有一个概念。 注意:服务器不同结果不同,结果不具有普适性。 服务器配置 配置参数CPU…

MySQL数据库操作篇2(表的增删查改约束)

在数据类型那篇文章里,笔者曾经提到过约束条件,但也只是简单的提了提,并没有展开来说,约束条件是MySQL为确保数据正确性,安全性,以及倒逼程序员规范操作的一大利器,这篇文章笔者详细谈谈有哪些约…

0019-TIPS-2019-tokyowesterns-gnote : switch(jump) Doubule Fetch

漏洞源码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/proc_fs.h> #include <linux/string.h> #include <linux/slab.h> #include <asm/uaccess.h>…