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通过三角不等式来优化这一过程,减少无效计算。 困难在于三角不等式给出了上界,但我们需要下界以…

《微信小程序开发从入门到实战》学习八十六

6.15 设备API 6.15.5 屏幕亮度API 使用wx.setScreenBrightness可设置屏幕亮度。示例代码如下&#xff1a; wx.setScreenBrightness({ value: 0.5, // 屏幕亮度值&#xff0c;范围0~1,1表示最亮 success() {} }) 使用wx.getScreenBrightness可获取屏幕亮度&#xff0c;示例代…

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

问: 回答: 问: 我跟随输入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. …

C# 十大排序算法

以下是常见的十大排序算法&#xff08;按照学习和实现的顺序排列&#xff09;&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;希尔排序&#xff08;Shell Sort&…

LLM设计原理学习笔记

1 设计原则 &#xff08;1&#xff09;不要将多模态特征直接线性相加 博文《马毅LeCun谢赛宁曝出多模态LLM重大缺陷&#xff01;开创性研究显著增强视觉理解能力》描述了多模态encoding线性相加带来的问题&#xff1b;

推荐几种常用Web前端开发工具

工欲善其事&#xff0c;必先利其器。一个好的编辑器&#xff0c;往往能帮助开发人员提高编码效率。下面为大家推荐几款前端常用的编辑器。 1.websorm WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的H…

【VTKExamples::PolyData】第九期 ExtractCellsUsingPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ExtractCellsUsingPoints,并解析vtkSelectionNode接口,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录…

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…

flask 与小程序 购物车删除和编辑库存功能

编辑 &#xff1a; 数量加减 价格汇总 数据清空 mina/pages/cart/index.wxml <!--index.wxml--> <view class"container"><view class"title-box" wx:if"{{ !list.length }}">购物车空空如也&#xff5e;</view>…

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

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

Curl- go的自带包 net/http实现

Curl- go的自带包 net/http实现 case http包中的Request 发送请求的步骤&#xff1a;1. 创建客户端 2. 发送请求 3. 接受响应 client : &http.Client{}req, _ : http.NewRequest("POST", url, nil) // request中有很多参数可以设置//设置头部 req.Header.se…

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

文章目录 一、禅道入门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 产品…

axios封装-reques.js

1. 简介 参考网址&#xff1a;http://www.axios-js.com/zh-cn/docs/#axios-create-config 在现代的前端开发中&#xff0c;我们经常需要与后端API进行交互&#xff0c;而axios是其中的一个非常流行的选择。为了简化请求的处 理和增强代码的可读性&#xff0c;我们经常需要对…

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;或右&…