利用canvas压缩图片

前情提要

页面打印导出pdf文件的时候,图片大小会影响pdf文件大小。
为了减小pdf文件大小,需要将图片压缩一下。在只有图片地址的情况下,将图片压缩后显示,一开始用的browser-image-compression插件,这是js压缩,是个异步函数,速度有点慢,于是大佬提出用canvas压缩,一番百度之后,抽出了一个基础版。
不考虑代码优雅问题,只说能用就行。

1 代码

const imgUrl = "图片地址"
// 创建一个img标签
const img = new Image();
// 先给img加上onload方法,再设置src,防止设置onload的时候,已经加载好图片,onload就一直不触发
img.onload = () => {// 创建canvas  const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');// 设置canvas宽高,具体设置多少,后面解释canvas.width = canvasWidth;canvas.height = canvasHeight;// 在canvas绘制前填充白色背景。// 遇到过白底的证件照压缩之后背景色变成了黑底,所以加一步填充背景色,不加也不影响压缩。ctx.fillStyle = "#fff";// 绘制图片ctx.drawImage(img, 0, 0, canvas.width, canvas.height);// canvas转成图片地址,在这一步进行文件大小压缩,第二个参数设置图片质量,不写默认0.92,后面解释为什么写0.2const base64 = canvas.toDataURL('image/jpeg', 0.2);// 拿到新的图片地址后就能用来显示了,如何传给img标签大家就各显神通吧,后面会给一种方案
}
img.src = imgUrl;

示例图片:4000 × 2472 px 6.8M
页面显示:162 × 100 px
页面放大150%截图

2 canvas的宽高

canvas的宽高设置会影响最终图片的质量(模糊度和大小两方面)。
一般来说,原图尺寸 >> 页面显示的缩略图,原图几百几千px的宽高,放到页面上可能就被缩小到几十px,所以canvas大小可以从原图到缩略图,取值范围非常广。
(在toDataURL第二个参数默认0.92的情况下)
设置原图的尺寸,压缩效果有点差,但是图片比较清晰;
设置缩略图尺寸,压缩效果较好,但是图片模糊;
考虑到导出pdf之后,图片也就指甲盖大小,图片糊点就糊点吧,减小pdf大小最重要。但是我也不想让图片糊成马赛克,毕竟实际的缩略图尺寸真的太小了。所以我用的是缩略图宽高*4的尺寸

在这里插入图片描述

3 toDataURL第二个参数

toDataURL第二个参数设置也会影响最终图片的质量(模糊度和大小两方面)。
quality越大,图片的质量越高(图片越清晰,文件大小也越大),取值范围是0~1.0之间的double值。
网上看到一种说法是设置成0.2-0.5之间可以有效的压缩图片体积,减小pdf大小最重要,于是我用了0.2。
在这里插入图片描述

3 toDataURL第一个参数

第一个参数指定了图像的类型,例如"image/jpeg"或者"image/png",如果不指定,则默认使用"image/png"。
(网上查到)toDataURL第二个参数只适用于image/jpeg 或 image/webp类型的图片,他表示图像的显示质量,所以没管图片类型,toDataURL第一个参数都是"image/jpeg"
试了下"image/jpg"和"image/png",同一张图,原图尺寸的情况下,压缩文件变大了,如果使用缩略图尺寸,那倒是压缩了,毕竟图片是真变小了,但效果没有"image/jpeg"好。
(至于原因,有大佬补充吗?)

4 canvas.toDataURL()之后图片大小增加

如果将canvas设置为缩略图尺寸,应该是不会遇到标题中的情况的,毕竟图片尺寸小了那么多,文件大小应该不至于变大(个人见解)
但如果canvas使用原图尺寸,会比较容易遇上压缩之后文件还变大了的情况。
(网上看到)有种解释是文件体积过小反而会出现越压缩体积越大,这种情况可以设置一个体积阀门,小于某个尺寸(比如300K)的时候不进行压缩。
虽然最后没用上这个方案,但是测试的时候遇到过这个问题,所以记一下,如何根据图片url获取到图片大小。

5 本地验证遇到了跨域问题

测试canvas压缩图片可行性的时候,用的本地图片,结果遇到跨域问题
在这里插入图片描述在这里插入图片描述

Access to image at ‘file://xxx/xxx.jpg’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted.

4.1 查了下,可以改成使用图床。

随便找的免注册图床,https://wmimg.com/
这个图床的貌似有点问题,4.93M的图片上传之后变成6.8M,不过测试canvas压缩效果倒是比较明显。
这个图床也是免注册,https://postimages.org/
但是它自带的图片压缩功能,把4.93M的图片压成了33.8k,它都压那么好了我还能压什么。

4.2 然后,问题变成另一个报错。

在这里插入图片描述

Uncaught DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.at img.onload ()

(网上查到)这是由于drawImage()向canvas导入的图片跨域而导致的。
这个好解决,给img加一下crossOrigin属性,打开跨域资源允许权限

const img = new Image();
img.crossOrigin = "Anonymous";

如果加上了crossOrigin = "Anonymous"依然存在跨域问题,那就换个图床。
因为存放图片地址的服务器也要开启跨域允许权限,改不了服务器,那就换个服务器吧。

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

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

相关文章

Elasticsearch:Node.js ECS 日志记录 - Winston

这是继上一篇文章 “Elasticsearch:Node.js ECS 日志记录 - Pino” 的续篇。我们继续上一篇文章来讲述使用 Winston 包来针对 Node.js 应用生成 ECS 向匹配的日子。此 Node.js 软件包为 winston 记录器提供了格式化程序,与 Elastic Common Schema (ECS) …

迈巴赫S480升级头等舱行政独立四座马鞍小桌板追求极致舒适

迈巴赫 S480 一直以来都代表着尊贵与奢华的巅峰。然而,对于追求极致舒适与专属体验的车主而言,常规配置或许仍不足以满足其苛刻的需求。正因如此,迈巴赫 S480 的头等舱行政独立 4 座改装应运而生,为这款豪华座驾注入了全新的灵魂。…

惟客数据Q2荣誉成绩单新鲜出炉

作为众多头部企业客户的数字化经营合作伙伴 WakeData惟客数据一直坚持以客户为中心,以数据驱动 致力于让数据智能商业落地更敏捷 凭借值得信赖的客户经营数字化和资源管理数字化实力 惟客数据在2024年第二季度斩获多项荣誉 1、 第一新声《2023年度中国高科技高…

【鸿蒙学习笔记】MVVM模式

官方文档:MVVM模式 [Q&A] 什么是MVVM ArkUI采取MVVM Model View ViewModel模式。 Model层:存储数据和相关逻辑的模型。View层:在ArkUI中通常是Component装饰组件渲染的UI。ViewModel层:在ArkUI中,ViewModel是…

STM32智能机器人导航系统教程

目录 引言环境准备智能机器人导航系统基础代码实现:实现智能机器人导航系统 4.1 数据采集模块 4.2 数据处理与导航算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:机器人导航应用与优化问题解决方案与优化收尾与总结 1. 引言 智能机器…

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

【Java安装】windows10+JDK21+IDEA

文章目录 一、JDK安装1. 下载完成后按照自己需要的位置安装2. 配置环境变量2.1 JAVA_HOME变量2.2 PATH配置 3. 验证4. helloworld 二、IDEA安装三、IDEA-HelloWorld 一、JDK安装 JDK安装链接 1. 下载完成后按照自己需要的位置安装 2. 配置环境变量 2.1 JAVA_HOME变量 安装…

unity知识点 专项四 一文彻底说清楚(锚点(anchor)、中心点(pivot)、位置(position)之间的关系)

一 概述 想要使UI控件在屏幕中达到正确的显示效果,比如自适应屏幕尺寸、固定边距等等,首先要理清楚几个基本概念和设置:锚点(anchor)、中心点(pivot)、位置(position)、UI缩放模式、父物件的transform设置 二 Anchor、Pivot与Position 2…

【Unity】UGUI的基本介绍

Unity的UGUI(Unity User Interface)是Unity引擎内自带的UI系统,官方称之为UnityUI,是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案。以下是关于Unity的UGUI的详细介绍: 一、UGUI的特点 灵活性&#xff1a…

**kwargs 字典解包传参的方式

字典解包传参 在Python中,****kwargs**是一种通过字典解包 (dictionary unpacking) 的方式进行参数传递的方式。它将一个字典的键值对解包并传递给函数的命名参数。 示例代码 kwargs实参: {name: "jordan", age: 18, score: [80, 85, 85]} get_info形…

【收藏】欧盟CE、美国FDA法规及标准查询常用网站

01 CE法规&标准查询网站 医疗器械主管部门的网站 网址: https://www.camd-europe.eu/ 简介: CAMD的全称是Competent authorities for medical devices,翻译成中文叫做医疗器械监管机构,实际上它指的是欧盟成员国医疗器械监管机构的联盟&#xff…

NAT:地址转换技术

为什么会引入NAT? NAT(网络地址转换)的引入主要是为了解决两个问题 IPv4地址短缺:互联网快速发展,可用的公网IP地址越来越少。网络安全:需要一种方法来保护内部网络不被直接暴露在互联网上。 IPv4 &…

王老师 linux c++ 通信架构 笔记(一)linux虚拟机的安装

(0)本门课程会涉及很多知识。在此集中记录,做笔记,也可能加入别的专栏。 (1) vmware 15 的下载和密钥上网查找。 ubuntu - 16 - 04 的版本才 800 M ,来 csdn 找镜像 下载。 (2&#…

23款奔驰S400升级原厂后排电动座椅调节有哪些功能

奔驰 S400 商务版升级后排电动座椅后,通常会具备以下功能: • 电动调节功能:可以通过按钮或控制面板来调节座椅的前后、上下、倾斜等位置,以获得最佳的舒适度。 • 座椅加热功能:在寒冷的天气中,座椅加热…

计算机网络之令牌环

1.令牌环工作原理 令牌环(Token Ring)是一种局域网(LAN)的通信协议,最初由IBM在1984年开发并标准化为IEEE 802.5标准。在令牌环网络中,所有的计算机或工作站被连接成一个逻辑或物理的环形拓扑结构。网络中…

jvisualvm工具使用--添加远程监视

jvisualvm简介 jvisualvm该工具位于jdk的bin目录下,是jdk自带的可用于监控线程、内存情况、查看方法的CPU时间和内存中的对 象、已被GC的对象、反向查看分配的堆栈等,即:Java虚拟机监控、故障排查及性能分析工具。 远程监控方法 以windows端…

直面生产制造的8大核心痛点

1.制造部门的计划紊乱问题 1.1计划的重要性与常见缺陷 计划是制造部门高效运作的前提。在实际运作中,计划的缺失或不周会导致生产效率的大幅降低。常见缺陷包括: -缺乏综合的生产计划,过分依赖销售计划,忽视生产和采购的实际能…

一文学会 BootStrap

文章目录 认识BootStrap历史优缺点使用注意安装CDN源码引入包管理器 媒体查询屏幕尺寸的分割点(Breakpoints)响应式容器网格系统基本使用底层实现.container.row.col、.col-份数 网格嵌套自动布局列 Auto-layout响应式类 Responsive Class 响应式工具类-…

WAIC2024 上海 | Gooxi 全面展示智算新成果,加速人工智能落地应用

浦江之畔,大咖云集;智能浪潮,奔涌不息。7月4日,被誉为人工智能界风向标的世界人工智能大会暨人工智能全球治理高级别会议在上海盛大召开,Gooxi此次携最新AI服务器以及解决方案参与,以算为擎赋能新质生产力&…

花朵短视频:四川江兴川丰科技有限公司

花朵短视频:绽放于屏幕间的自然诗篇 在快节奏的现代生活中,我们常常渴望一抹清新与宁静,以慰藉心灵的疲惫。而花朵短视频,就像是大自然精心编织的一首首无声诗篇,四川江兴川丰科技有限公司通过手机屏幕的方寸之间&…