当前位置: 首页 > 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);
``

相关文章:

  • 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比较机制
  • 中国海警局新闻发言人就日民用飞机侵闯我钓鱼岛领空发表谈话
  • 市场驱动的系统改造:丹麦零弃风经验研究
  • 朝中社:美在朝鲜半岛增兵将进一步增加其本土安全不确定性
  • 因雷雨、沙尘等天气,这些机场航班运行可能受影响
  • 格桑花盛放上海,萨迦艺术团襄阳公园跳起藏族舞
  • 生命与大海相连:他在300多米的深海行走,在沉船一线打捞救援