前端demo: 将传入文件压缩到不超过指定大小(M)

1.compressImage函数:通过canvas将选择文件压缩后展示在页面上

2.compressImageToSetsize函数:传入参数file, quality = 0.6,setsize = 1,借助compressorjs将传入文件压缩到不超过指定大小(M)

3.compressImageN:函数测试图片文件压缩前后的对比

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>图片压缩</title>  </head>  <style>* {margin: 0;}.box {padding: 100px;width: 100%;margin: 0 auto;}div {margin-top: 20px;width: 200px;}</style></head><body><div class="box"><div class="box-file"><input type="file" id="imageFileInput" accept="image/*">  <button onclick="compressImage()">压缩图片</button>  <button onclick="compressImageN()">多次压缩图片</button> <canvas id="canvas" style="display: none;"></canvas>  <img id="outputImage" style="max-width: 300px;">  </div></div><script src="https://cdn.bootcdn.net/ajax/libs/compressorjs/1.2.1/compressor.min.js"></script><script>// 通过canvas将选择文件压缩后展示在页面上function compressImage() { const input = document.getElementById('imageFileInput');  const file = input.files[0];  console.log('压缩前',file);const canvas = document.getElementById('canvas');  const ctx = canvas.getContext('2d');  const img = document.getElementById('outputImage');  // 创建一个新的Image对象,用于加载图片文件  const imgElement = new Image();  imgElement.onload = function() {  // 设置canvas的大小与图片一样大  canvas.width = imgElement.width;  canvas.height = imgElement.height;  // 将图片绘制到canvas上  ctx.drawImage(imgElement, 0, 0, imgElement.width, imgElement.height);  // 获取压缩后的图片数据URL(base64格式)  const compressedDataUrl = canvas.toDataURL('image/jpeg', 0.8); // 第二个参数是压缩质量,范围是0-1,1为最高质量  // 将压缩后的图片展示在页面上  img.src = compressedDataUrl;  };  imgElement.src = URL.createObjectURL(file); // 使用URL对象将文件转换为URL,以便加载到Image对象中  }// 借助compressorjs将传入文件压缩到不超过指定大小(M)function compressImageToSetsize(file, quality = 0.6,setsize = 1)  {const fileSize = Math.ceil((parseInt(String(file.size), 10) / (1024 * 1024)) * 1000) / 1000if (fileSize < setsize) {return file}return new Promise((resolve, reject) => {new Compressor(file, {quality, //压缩质量, 0-1convertTypes: [file.type], //转换的类型async success(result) {let newfile = new File([result], file.name, { type: file.type })const newfileSize = Math.ceil((parseInt(String(newfile.size), 10) / (1024 * 1024)) * 1000) / 1000if (newfileSize > 2) {const nextQuality = quality * 0.5if (nextQuality < 0.001) {console.warn('compress fail-->>quality < 0.0001, please check img')resolve(null)return}newfile = await Service.compressImageToSetsize(newfile, quality * 0.5)}resolve(newfile)},error(err) {console.warn('compress fail-->>', err)reject()},})})}async function compressImageN(){const input = document.getElementById('imageFileInput');  const file = input.files[0];  console.log('压缩前',file);let newFile = await compressImageToSetsize(file)console.log('压缩后',newFile);}</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE使用C++添加FGameplayTag(游戏标签)

首先Ue会有一个UGameplayTagsManager类型的对象 游戏标签管理器(全局中就有一个) 我们直接通过 UGameplayTagsManager::Get()静态函数拿到 全局唯一的游戏标签管理器的实例 返回的是个左值引用 之后通过调用 AddNativeGameplayTag()函数就可添加游戏标签了 就这么简单 第…

按条件自动搜索文件

在计算机的某个文件夹中&#xff0c;假如有一大堆不同格式的文件&#xff0c;如下图&#xff1a; 我们的目的&#xff1a;快速查找出文件名中包含某文字内容的指定格式的文件&#xff0c;看看它们都放在哪里&#xff1f;通过分析&#xff0c;可能在当前文件夹中也可能在某个子…

核心类库ArrayList、hashMap等

八. 核心类库 1. ArrayList 数组缺点 ArrayList&#xff0c;它常常被用来替代数组 数组的缺点&#xff1a;不能自动扩容&#xff0c;比如已经创建了大小为 5 的数组&#xff0c;再想放入一个元素&#xff0c;就放不下了&#xff0c;需要创建更大的数组&#xff0c;还得把旧…

【Spring Boot 3】【@Scheduled】静态定时任务

【Spring Boot 3】【@Scheduled】静态定时任务 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总…

防御保护---防火墙(安全策略、NAT策略实验)

防御保护---防火墙&#xff08;安全策略、NAT策略实验&#xff09; 1.实验需求2.实验说明及思路3.实验配置3.1 配置IP地址以及VLAN3.2 配置防火墙IP地址及划分区域3.3 配置防火墙安全策略3.4 配置防火墙NAT策略 1.实验需求 1.生产区在工作时间内可以访问服务器区&#xff0c;仅…

【iOS ARKit】人脸追踪之挂载虚拟元素

人脸跟踪&#xff08;Face Tracking&#xff09;是指将人脸检测扩展到视频序列&#xff0c;跟踪同一张人脸在视频序列中的位置。是论上讲&#xff0c;任何出现在视频中的人险都可以被跟踪&#xff0c;也即是说&#xff0c;在连续视频帧中检测到的人脸可以被识别为同一个人。人脸…

ActiveMQ|01-ClassicArtemis功能介绍

接上篇-MQ消息队列主流消息服务规范及代表产品&#xff0c;ActiveMQ就是基于JMS消息服务规范的消息中间件组件&#xff0c;主要应用在分布式系统架构中&#xff0c;帮助构建高可用、 高性能、可伸缩的企业级面向消息服务的系统 本文速览&#xff1a; JMS对象模型ActiveMQ的功…

import tensorflow.contrib.slim as slim中contrib报红,显示没有导入contrib

本人环境&#xff1a; python 3.6 tensorflow 1.13 问题如下图&#xff1a; 解决方法&#xff1a; 找到包的位置&#xff0c;查看tensorflow中是否下载了contrib包&#xff0c;如果有的话&#xff0c;建议重新装一次TensorFlow 如果没有找找&#xff0c;可以在搜索栏搜一下…

【Web前端实操15】利用Grid布局完成九宫格

相关知识点&#xff1a; 创建多列 column-count 属性指定了需要分割的列数 列与列之间的间隙 column-gap 属性指定了列与列间的间隙 列边框 column-rule-style 属性指定了列与列间的边框样式 column-rule-width 属性指定了两列的边框厚度 column-rule-color 属性指定了…

【GitHub项目推荐--不错的Flutter项目】【转载】

01 可定制的图表库 FL Chart是一个高度可定制的 Flutter 图表库&#xff0c;支持折线图、条形图、饼图、散点图和雷达图 。 项目地址&#xff1a;https://github.com/imaNNeoFighT/fl_chart LineChart BarChart PieChart Sample1 Sample2 Sample3 …

哪吒汽车与经纬恒润合作升级,中央域控+区域域控将于2024年落地

近日&#xff0c;在2024哪吒汽车价值链大会上&#xff0c;哪吒汽车与经纬恒润联合宣布合作升级&#xff0c;就中央域控制器和区域域控制器展开合作&#xff0c;合作成果将在山海平台新一代车型上发布。 哪吒汽车首席技术官戴大力、经纬恒润副总裁李伟 经纬恒润在智能驾驶领域拥…

百度Apollo | 实车自动驾驶:感知、决策、执行的无缝融合

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

多维时序 | Matlab实现DBO-BiLSTM蜣螂算法优化双向长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现DBO-BiLSTM蜣螂算法优化双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现DBO-BiLSTM蜣螂算法优化双向长短期记忆神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-BiLSTM多变量时间序…

Python学习(14)|列表_元素的访问_出现次数统计_成员资格判断

37-列表-元素的访问-出现次数统计-成员资格判断 列表元素的增加&#xff1a; 1.通过索引直接访问元素。索引的区间在 [0,列表长度 - 1] 这个范围。超过这个范围则会抛出异常。 a [10,20,30,40,50,20,30,20,30] print(a[2]) #执行结果&#xff1a;30 print(a[10]) #报…

Ubuntu 申请 SSL证书并搭建邮件服务器

文章目录 Log 一、域名连接到泰坦&#xff08;Titan&#xff09;电子邮件二、NameSilo Hosting 避坑三、Ubuntu 搭建邮件服务器1. 环境准备2. 域名配置3. 配置 Postfix 和 Dovecot① 安装 Nginx② 安装 Tomcat③ 申请 SSL 证书&#xff08;Lets Encrypt&#xff09;④ 配置 pos…

Python NLP深度学习进阶:自然语言处理

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能领域中的一个重要分支&#xff0c;涉及到处理和理解人类语言的方法和技术。随着深度学习的快速发展&#xff0c;NLP的研究和应用也在不断进步。 在Python中&#xff0c;有许多强大的…

链表分割(新的错误:开头赋值)

1.单向链表&#xff1a;含有链表内容和下个链表的指针 2.双向链表&#xff1a;含有链表内容和上下两个链表的指针 3.带头和不带头&#xff1a;哨兵位的头结点&#xff08;不存储有效数据&#xff09;&#xff0c;主要区别在于链表为空时会存在一个哨兵位节点&#xff0c;优点…

ffmpeg读取媒体文件信息

rootyangwang-virtual-machine:/home/yangwang/Desktop/ffmpegdemo# ./ffmpeg_mediainfo Input #0, mp3, from ‘./1.mp3’: Metadata: encoder : Lizhi codec title : Hello artist : DJ&#xff5c;小七 album : 好乐分享 TLEN : 295636 genre : 网络电台 date : 2017 Durati…

Ubuntu 18.04 x86_64 上交叉编译 boost 库(ARMv7L)

先安装 ARMv7L 交叉编译器环境&#xff1a; 在 Ubuntu 18.04 x86_64 上面安装 Linux-ARMv7 A/L GCC编译器-CSDN博客 1、下载 boost 1.84 的源代码访问要编译的目录&#xff0c;并且解压出来源代码&#xff0c;切入源代码根目录 2、./bootstrap.sh --with-librariesfilesyste…

【C#】基础巩固

最近写代码的时候各种灵感勃发&#xff0c;有了灵感&#xff0c;就该实现了&#xff0c;可是&#xff0c;实现起来有些不流畅&#xff0c;总是有这样&#xff0c;那样的卡壳&#xff0c;总结下来发现了几个问题。 1、C#基础内容不是特别牢靠&#xff0c;理解的不到位&#xff…