canvas能压缩图片?

之前写过一篇使用命令行工具压缩图片的博文:使用yx-tiny命令行工具进行图片压缩,大家感兴趣可以去瞅一眼。

这篇简单说一下使用canvas压缩图片

其实思路很简单,我们选择了图片之后,会获取到对应的文件流对象,然后我们将这个文件流再转为图片,然后使用canvas将这个图片画出来,最后调用canvas.toDataURL 或者 canvas.toBlob 方法传入对应的参数来实现图片的压缩,下面是压缩图片的方法:

function compressJpg(file: File, quality: number = 0.5): Promise<Blob | null> {return new Promise((resolve, reject) => {if(!file.name.endsWith('.jpg') && !file.name.endsWith('jpeg')) {return reject('仅支持JPG格式图片压缩')}try {const img = new Image()const fr = new FileReader()fr.readAsDataURL(file)fr.onload = e => {img.src = e.target?.result as stringsetTimeout(() => {const { width, height } = imgconst canvas = document.createElement('canvas') as HTMLCanvasElementcanvas.width = widthcanvas.height = heightconst ctx = canvas.getContext('2d')ctx?.drawImage(img, 0, 0, width, height)canvas.toBlob(blob => {resolve(blob)}, file.type, quality)})}} catch(e) {reject(e)}})
}

我们传入一个要压缩的文件对象和质量参数,返回一个Promise,then中可以获取到压缩后的文件对象。

下面测试一下:

const input = document.getElementById('input') as HTMLInputElementinput.addEventListener('input', inputChange)function inputChange(evt: Event) {const file = (evt.target as HTMLInputElement).files?.[0] as Fileconsole.log(file.size, '原图片的大小--->>')compressJpg(file, 0.1).then(blob => {if(!blob) returnconsole.log(blob.size, '压缩后的大小--->>')})
}

 

这是控制台的打印,可见确实是图片的大小小了很多,但其实看图片模糊了很多。

总结一下:

1. 从上面能看出来在牺牲一些清晰度的情况下,用这种方式压缩还是可以的,特别是一些本身就比较小的图片,但其实这并不是真正的压缩图片,真正压缩图片还是建议使用工具压缩,例如photoshop;或者在线网站压缩,例如:熊猫压缩

2. 大家可以看到我的方法名为:compressJpg 之所以取这个方法名,是因为此方式其实仅支持jpg格式的图片压缩,如果是png格式,可能还会变大,大家可以测试一下,再对比一下图片质量 

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

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

相关文章

jvm复习,深入理解java虚拟机一:运行时数据区域

程序计数器&#xff08;Program Counter Register&#xff09; 它是程序控制流的指示器&#xff0c;简单来说&#xff0c;为了线程切换后能恢复到正确的执行位置&#xff0c;每条线程都需要有一个独立的程序计数器 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xf…

【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间

2024-1-19 文章目录 [2809. 使数组和小于等于 x 的最少时间](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)思路&#xff1a; 2809. 使数组和小于等于 x 的最少时间 思路&#xff1a; 获取两个列表的长度n&#xff0c;并初始化一个二维数组f&…

一种更快的Kmeans原理与实现

普通的k-means实现大多需要多轮迭代,一轮需要O(n * k)的复杂度,其中n是数据量,k是聚类的数量。观察到大部分地方的标准均值中的大多数距离计算都是冗余的。 所以Elkan-Kmeans通过三角不等式来优化这一过程,减少无效计算。 困难在于三角不等式给出了上界,但我们需要下界以…

我在提交代码的时候突然发现别人刚才提交了一点代码,我没有拉取导致问题,请问怎么解决

问: 回答: 问: 我跟随输入git pull ,然后又以下提示: Merge branch systemPower_dev of https://xxxx.com into xxxx_dev # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. …

SELF自动化指令集构建代码实现

SELF-Instruct paper: 2022.12, SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions https://github.com/yizhongw/self-instruct https://github.com/tatsu-lab/stanford_alpaca#data-generation-process 一语道破天机&#xff1a;类似非线性插值&a…

plt.animation绘制动画

目录 一&#xff1a;介绍 二&#xff1a;创建线动画 一&#xff1a;介绍 matplotlib.animation 是 Matplotlib 库中的一个模块&#xff0c;用于创建动画。它提供了多种工具和函数&#xff0c;使您能够轻松地创建各种类型的动画。 二&#xff1a;创建线动画 import numpy as…

【Linux】第三十站:进程间通信

文章目录 一、是什么二、为什么三、怎么办四、管道1.什么是管道2.管道的原理3.接口4.编码实现5.管道的特征6.管道的四种情况 一、是什么 两个或者多个进程实现数据层面的交互 因为进程独立性的存在&#xff0c;导致进程通信的成本比较高 通信是有成本的&#xff0c;体现在要打破…

【禅道】的介绍及安装使用

文章目录 一、禅道入门1.1 概述1.2 特点1.2.1 私有化部署&#xff08;禅道&#xff09;&#xff1a;1.2.2 SaaS云部署&#xff08;云禅道&#xff09;&#xff1a; 1.3 安装1.4 启动禅道 二、禅道的使用2.1 编辑公司信息2.2 搭建组织架构2.2.1 创建部门2.2.2 增加员工 2.2 产品…

Solana Mobile开启第二代Saga手机预售,怎么购买Solana Mobile?

PANews 1月17日消息&#xff0c;Solana Mobile官方宣布开启其第二代Saga手机&#xff08;Chapter 2&#xff09;的预售&#xff0c;预购押金为450美元&#xff0c;预计将于2025年上半年发货。同时&#xff0c;Chapter 2的发售将会包括推荐&#xff08;Referrals&#xff09;和积…

用MATLAB函数在图表中建立模型

本节介绍如何使用Stateflow图表创建模型&#xff0c;该图表调用两个MATLAB函数meanstats和stdevstats。meanstats计算平均值&#xff0c;stdevstats计算vals中值的标准偏差&#xff0c;并将它们分别输出到Stateflow数据平均值和stdev。 请遵循以下步骤&#xff1a; 1.使用以下…

sql570 | 至少有5名下属的经理 | join on | group by | having

讲给一张表&#xff0c;表字段分别为 id 、姓名、部分、经理id&#xff0c;可能存在张三既是下属也是经理 现在找出下属起码有5名员工的经理 CREATE TABLE Employee (id INT,name VARCHAR(255),department VARCHAR(255),managerId INT );INSERT INTO Employee (id, name, depar…

数据库的内连接和外连接

数据库的内连接和外连接 内连接: 两个或两个以上的表进行关联查询时&#xff0c;查询的结果集中 返回所有满足连接条件的行。 外连接: 两个或两个以上的表进行关联查询时&#xff0c;查询的结果集中 除了返回满足连接条件的行以外&#xff0c;还返回左&#xff08;或右&…

rabbitmq的介绍、使用、案例

1.介绍 rabbitmq简单来说就是个消息中间件&#xff0c;可以让不同的应用程序之间进行异步的通信&#xff0c;通过消息传递来实现解耦和分布式处理。 消息队列&#xff1a;允许将消息发到队列&#xff0c;然后进行取出、处理等操作&#xff0c;使得生产者和消费者之间能够解耦&…

scratch打蝙蝠 2023年12月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

目录 scratch打蝙蝠 一、题目要求 1、准备工作 2、功能实现 二、案例分析

基于SpringBoot Vue博物馆管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Qt拖拽组件与键盘事件

1.相关说明 1.设置widget或view的拖拽和放置模式函数setDragDropMode参数说明&#xff0c;NoDragDrop(无拖拽和放置)、DragOnly(只允许拖拽)、DropOnly(只允许放置)、DragDrop(允许拖拽和放置)、InternalMove(只移动不复制) 2.设置widget或view的放置动作函数setDefaultDropAct…

MacOS X 安装免费的 LaTex 环境

最近把工作终端一步步迁移到Mac上来了&#xff0c;搭了个 Latex的环境&#xff0c;跟windows上一样好用。 选择了 Mactex 做编译&#xff0c;用 Texmaker 做编辑&#xff1b; 1. 下载与安装 1.1 Mactex 下载安装 MacOS 安装和示例 LaTex 的编译器 与 编辑器 编译器使用免费…

Cocos在VsCode中调试-端口安全问题 net::ERR_UNSAFE_PORT

问题: POST http://127.0.0.1:6000/api/login net::ERR_UNSAFE_PORT 原因&#xff1a; 这个错误表明你在尝试使用一个被认为是不安全的端口进行网络请求。通常情况下&#xff0c;浏览器会限制使用一些特定的端口&#xff0c;因为它们被认为是潜在的安全风险。 在这种情况下&a…

IO、NIO、IO多路复用

IO是什么&#xff1f; IO分为两类&#xff0c;它们之间是有区别的&#xff0c;而且有很大的区别&#xff1b;1. 文件系统的IO 也叫本地io&#xff0c;就是和磁盘或者外围存储设备进行读写操作&#xff0c;外围设备有USB、移动硬盘等等&#xff1b;2. 网络的IO 将数据发送给对方…

Jetson Orin Nano使用OpenCV获取视频帧率和帧数的方法

测试过程 首先确认下视频的播放时间 使用cv库来获取帧率和帧数&#xff0c;测试代码如下 import cv2 cap cv2.VideoCapture("xxx.mp4") if not cap.isOpened():print("Cannot open camera")exit()# get default video FPS fps cap.get(cv2.CAP_PROP_F…