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

【JS压缩图片】js压缩图片至指定大小

yaSuoImg.js

/*** 加载图片* @param {URL} url 图片地址* @returns {Promise.<Image>}*/
const loadImageAsync = (url) => {return new Promise((resolve, reject) => {const image = new Image();image.src = url;image.onload = function () {resolve(image);};image.onerror = function (err) {reject(new Error("出错 " + err));};});
}/*** 图片压缩* @param {File} file 拾取的图片文件File* @param {Number} [maxSizeKB=300] 超过maxSizeKB启动压缩(KB)* @param {String} [imgType="webp"] 压缩后的图片格式,推荐webp,既无损压缩* @param {Number} [opy=.9] 清晰度 0-1 推荐0.9,既不失真,又可压缩图片内存* @return {Promise.<Base64URLString>}*/
export const compress = async (file, maxSizeKB = 300, imgType = 'webp', opy = .9) => {const canvas            = document.createElement("canvas"),context           = canvas.getContext("2d"),image             = await loadImageAsync(URL.createObjectURL(file)),{ height, width } = image;if (file.size > maxSizeKB * 1024) {let   rate       = 0;                 // 压缩率 const fileSizeKB = file.size / 1024;  // 文件大小KB, file.size给的是字节Byteif (fileSizeKB > maxSizeKB) { // 当图片大小超标,才进行压缩rate = (fileSizeKB - maxSizeKB) / fileSizeKB; // 计算压缩率}// 纠正因子,不加会导致压缩出的文件太小const factor        = 0,cvWidth       = width * (1 - rate + factor),cvHeight      = height * (1 - rate + factor);canvas.height = cvHeight;canvas.width  = cvWidth;context.clearRect(0, 0, cvWidth, cvHeight);context.drawImage(image, 0, 0, cvWidth, cvHeight);} else {canvas.height = height;canvas.width  = width;opy           = .7context.clearRect(0, 0, width, height);context.drawImage(image, 0, 0, width, height);}URL.revokeObjectURL(file)//释放内存return canvas.toDataURL(`image/${imgType}`, opy);
} 

import { compress } from "/yaSuoImg.js";
const  imgBlobSrc = await compress(file);
``
http://www.dtcms.com/a/168801.html

相关文章:

  • Flutter - 概览
  • 深入解析C++11委托构造函数:消除冗余初始化的利器
  • 【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析
  • AUTOSAR图解==>AUTOSAR_SRS_BusMirroring
  • 贝叶斯算法(Bayesian Algorithms)详解
  • WPF之ProgressBar控件详解
  • SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+欧拉回路】
  • 【愚公系列】《Manus极简入门》011-习惯养成教练:“习惯塑造师”
  • 2025年- H19-Lc127-48.旋转矩阵(矩阵)---java版
  • Chromium 134 编译指南 - Android 篇:安装构建依赖项(七)
  • Spring、Spring MVC、SpringBoot、Spring Cloud的关系和区别(Spring生态项目关系和区别详解)
  • wpf 输入框 在输入时去除水印
  • Ubuntu环境下如何管理系统中的用户:创建用户、删除用户、修改密码、切换用户、用户组管理
  • C++-Lambda表达式
  • VLM Qwen2.5VL GRPO训练微调 EasyR1 多机多卡训练(2)
  • 代码随想录算法训练营第60期第二十二天打卡
  • Linux diff 命令使用详解
  • 重构之道:识别并替换不合适使用的箭头函数
  • 19.9/Q1,GBD数据库高分文章解读
  • React pros比较机制
  • K8s ConfigMap实战:像设置手机一样管理配置!
  • 探索 Disruptor:高性能并发框架的奥秘
  • 单一职责原则(SRP)
  • Nginx核心功能及正则表达
  • 使用arduino控制超声传感器HC-SR04测量距离
  • 清洗数据集
  • C#编程精要:局部变量、类型推断与常量深度解析
  • HTTP和HTTPS
  • 内部类(3):匿名内部类
  • 拆解一个550-800Mhz的LC滤波器内部大图配测试曲线