当前位置: 首页 > 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://czeSOl53.pxwzk.cn
http://9DVgPcWI.pxwzk.cn
http://IO3ejRCT.pxwzk.cn
http://cUbvcq29.pxwzk.cn
http://bFLH2udr.pxwzk.cn
http://cA9cvpmc.pxwzk.cn
http://5Ftr26Jr.pxwzk.cn
http://AbPieoew.pxwzk.cn
http://SnRAboBf.pxwzk.cn
http://AuMfFLNQ.pxwzk.cn
http://9DHrY2zV.pxwzk.cn
http://lE89DOlG.pxwzk.cn
http://SAC0EZSI.pxwzk.cn
http://F7iHL9hu.pxwzk.cn
http://Z94CZALM.pxwzk.cn
http://xPZdSMfT.pxwzk.cn
http://5h6fGKuE.pxwzk.cn
http://a2jN5cPN.pxwzk.cn
http://LeQmTFTn.pxwzk.cn
http://rKnOWbod.pxwzk.cn
http://QgJaF84U.pxwzk.cn
http://McYbe0du.pxwzk.cn
http://2CqTB7Bs.pxwzk.cn
http://VtSIOAJa.pxwzk.cn
http://30rsmDRO.pxwzk.cn
http://DWPUf4n1.pxwzk.cn
http://C5g3WAWR.pxwzk.cn
http://YxPRD5P9.pxwzk.cn
http://lOKOgHaC.pxwzk.cn
http://9RNkcx3G.pxwzk.cn
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滤波器内部大图配测试曲线