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

【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.xdnf.cn/news/3532.html

相关文章:

  • MCP智能体意图识别与工具路由:让AI自主决策调用链路
  • 支持向量机(SVM)详解
  • Arduino逻辑控制详细解答,一点自己的想法记录
  • 2025A卷华为OD机试真题-数组二叉树(C++/Java/Python)-100分
  • 当神经网络突破摩尔定律:探索大模型时代的算力新纪元
  • ValueError: expected sequence of length 8 at dim 2 (got 0)
  • 解构区块链身份认证:从ID到零知识证明的实战指南
  • JAVA:使用 XStream 实现对象与XML转换的技术指南
  • GPT-4o 图像生成与八个示例指南
  • 免费视频文件压缩工具使用教程与技巧详解
  • [面试]SoC验证工程师面试常见问题(四)
  • 中小企业MES系统概要设计
  • shell_plus
  • Day.js和Moment.js对比,日期时间库怎么选?
  • C++调试(贰):Dump文件的生成(附Qt示例)
  • 2.maven 手动安装 jar包
  • 【优选算法 | 位运算】位运算基础:深入理解二进制操作
  • lib和dll介绍和VS2019生成实例
  • 【算法基础】三指针排序算法 - JAVA
  • 第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题(编程题前两题)
  • 亚马逊云服务器性能深度优化方案(2025版)
  • 洛圣电玩系列部署实录:一次自己从头跑通的搭建过程
  • [javaEE]网络编程
  • Semantic Kernel 快速入门
  • (转)角色与动画的性能优化 | UnrealFest演讲干货
  • 云原生后端架构的实践与挑战:探索现代后端开发的未来
  • DeepSeek+Excel:解锁办公效率新高度
  • Aws S3上传优化
  • 力扣838.推多米诺随笔
  • STM32 ZIBEE DL-20 无线串口模块