js实现图片压缩

news2024/9/20 15:03:37

创建一个type="file"的input标签,用于文件上传。

<input type="file" name="" id="upload" value="" />

通过js实现图片压缩

 window.onload = function () {
   const upload = document.getElementById("upload");
   upload.onchange = uploadImage;
 };

 // 图片上传
 function uploadImage(event) {
   const file = event.target.files[0];
   console.log(file, "未压缩的图片file")
   createImage(file, async function (img) {
     createCanvas(img, 1200, file, async function (newFile) {
       console.log(newFile, "压缩后的图片")
     });
   });
 }

 // 生成图片副本
 // 将file通过FileReader 转换为base64格式
 async function createImage(file, callback) {
   const reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     const img = new Image();
     img.src = reader.result;
     callback(img);
   };
 }

 // 通过canvas绘制图片
 function createCanvas(img, max, file, callback) {
   const cvs = document.createElement("canvas");
   const ctx = cvs.getContext("2d");
   let width = img.naturalWidth || 400;
   let height = img.naturalHeight || 400;
   const ratio = width / height;
   if (width > max) {
     width = max;
     height = width / ratio;
   }
   cvs.width = width;
   cvs.height = height;
   img.onload = async function () {
     // 降低图片质量
     const base64 = await compressImage(cvs, ctx, img, width, height, max);
     // base64转成blod格式文件
     const BlobData = await convertBase64UrlToBlob(base64);
     // blod格式文件转成file格式并返回
     const this_file = new File([BlobData], file.name, {
       type: file.type,
     });
     callback(this_file);
   };
 }

 // 图片质量压缩 
 // 通过canvas.toDataUR()降低图片质量
 async function compressImage(cvs, ctx, img, width, height, max) {
 	// 图像质量  quality值越小,所绘制出的图像越模糊
   var quality = 0.7;
   var anw = document.createAttribute("width");
   anw.nodeValue = width;
   var anh = document.createAttribute("height");
   anh.nodeValue = height;
   cvs.setAttributeNode(anw);
   cvs.setAttributeNode(anh);
   ctx.drawImage(img, 0, 0, width, height);
   
   var base64 = cvs.toDataURL("image/jpeg", quality);
   return base64;
 }

 // base64转成blod格式文件
 async function convertBase64UrlToBlob(urlData) {
   var arr = urlData.split(","),
     mime = arr[0].match(/:(.*?);/)[1],
     bstr = atob(arr[1]),
     n = bstr.length,
     u8arr = new Uint8Array(n);
   while (n--) {
     u8arr[n] = bstr.charCodeAt(n);
   }
   return new Blob([u8arr], { type: mime });
 }

最终实现的效果如图所示
效果图

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

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

相关文章

9.10UEC++生成、销毁actor

BeginPlay&#xff1a; 1.SpawnActor&#xff1a;<模板类>&#xff08;模板::staticclass&#xff08;&#xff09;&#xff0c;FVector const class&#xff0c;FRotation const class&#xff09; 生成一个actor 2.Destory&#xff08;&#xff09;从世界中销毁一个a…

SSM学习笔记-------Spring(一)

SSM学习笔记-------Spring&#xff08;一&#xff09; Spring_day011、课程介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 2、Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概念…

【zabbix 代理服务器】

目录 一、部署 zabbix 代理服务器1、设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy2、初始化数据库1、创建数据库并指定字符集2、创建 zabbix 数据库用户并授权 3、导入数据库信息4、修改 zabbix-proxy 配置文件5、启动 zabbix-proxy6、在所有主机上配置 hosts 解析7、在…

Maven高级(四)--私服

一.作用 我们所拆分的模块是可以在同一个公司各个项目组之间的项目组之间进行资源共享的&#xff0c;这就需要Maven的私服来实现。 二.场景 两个项目组之间如何基于私服进行资源的共享的呢&#xff1f; 例如A开发了一个模块tlias-utils,B团队进行项目开发&#xff0c;要想使用…

CentOS7 主机万兆网卡配置端口聚合后如何与华为交换机连接并上网

环境: 组装机测试服务器 CentOS 7 CentOS Linux release 7.7.1908 (Core) 网卡1:瑞昱普通千兆板载网卡 网卡2:EB-LINK intel 82599芯片PCI-E X8 10G 光模块千兆单模1310 交换机 HW-S1730S-S48T4S-A Version 5.170 (S1730 V200R021C01SPC200) 光模块千兆单模1310 …

Python学习笔记(十七)————模块相关

目录 &#xff08;1&#xff09;模块 &#xff08;2&#xff09;模块的导入方式 ①import 模块名 ②from 模块名 import 功能名 ③from 模块名 import * ④as定义别名 &#xff08;3&#xff09;自定义模块 &#xff08;4&#xff09;测试模块 &#xff08;1&#xff09…

List移除元素的四种方式

List 移除某个元素 四种方式&#xff1a; 方式一&#xff0c;使用 Iterator &#xff0c;顺序向下&#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式二&#xff0c;倒序遍历 List &#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式…

使用TypeScript实现贪吃蛇小游戏(网页版)

本项目使用webpackts所编写 下边是项目的文件目录 /src下边的index.html页面是入口文件 index.ts是引入所有的ts文件 /modules文件夹是用来存放所有类的 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

VoxaMech 的机甲装备 — NFT 系列

一套新的机甲装备即将诞生&#xff1a;帝国甲虫套装是无与伦比的权威和威望的象征&#xff0c;体现了古代帝国甲虫的雄伟壮观。其华丽的铠甲散发着帝王般的优雅气息&#xff0c;其威严的外观在战场上令人肃然起敬。 每套装备由手臂部件、胸甲、头盔、腿部件和剑组成。每件装备单…

SpringBoot——业务层测试事务回滚

事务回滚 关于事务回滚的概念我们之前在学习数据库的时候已经提到过了&#xff0c;这里我们再次强化一下记忆。所谓的事务回滚就是在执行多条SQL语句的时候&#xff0c;如果其中一条SQL出现了异常导致执行失败&#xff0c;则数据库的状态回滚到执行多条SQL语句之前的状态&…

第六章:YOLO v1网络详解(统一的实时目标检测)

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:Mask R-CNN网络详解 第六章:YOLO v1网络详解 第七章:YOLO v2网络详解 第八章:YOLO v3网络详解 文章目录 系列文章目录技…

一起学SF框架系列5.7-模块Beans-BeanDefinition定义

在SF下&#xff0c;开发人员用xml或注解模式定义bean&#xff0c;框架把这些定义转化为内部BeanDefinition类&#xff0c;然后通过BeanDefinition类实现Bean的管理&#xff08;包括初始化、依赖注入及生命周期管理&#xff09;&#xff0c;因此了解Bean的定义、解析、使用过程非…

[kafka] windows下安装kafka(含安装包)

[kafka] windows下安装kafka&#xff08;含安装包&#xff09; 目录 前言 一、下载kafka安装包 1&#xff09;下载安装包 2&#xff09;解压安装包 二、运行zookeeper 1.运行zookeeper&#xff08;因为kafka必须要和zookeeper一起运行&#xff09; 三、运行kafka 四、使用fafka…

web3创业有哪些机会及具体案列(二)

目录 1. 去中心化金融&#xff08;DeFi&#xff09;&#xff1a;2. 去中心化身份验证和数字身份&#xff1a;3. 去中心化市场和电子商务&#xff1a;4. 区块链游戏和虚拟资产&#xff1a;5. 数据隐私和安全&#xff1a;6. 去中心化社交媒体&#xff1a;7. 去中心化能源交易&…

Spring容器扩展点在微服务中的使用

(20230306)Spring容器扩展点在微服务中的使用 文章目录 1. Spring扩展点梳理2.Spring扩展点应用场景2.1 整合NacosApplicationListener扩展场景——监听容器中发布的事件Lifecycle扩展场景——管理具有启动、停止生命周期需求的对象 2.2 整合RibbonSmartInitializingSingleton扩…

定时器中断实验(stm32)

目录 TIME的代码time.ctime.h main.c TIME的代码 time.c void TIM3_Int_Init(u16 arr,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//定时器TIM3初始化…

uview u-input 点击清除按钮,数据清空但视图未清空

问题描述&#xff1a; 点击 uview 的 u-input 输入框自带的清除按钮&#xff0c;v-model 绑定的数据清空了&#xff0c;但是输入框内还显示着之前的数据 解决方案&#xff1a; 将 v-model 绑定的值写到 data 初始变量中声明 原始代码&#xff1a; <u-input v-model"…

Spring对事务的支持

目录 事务的传播行为 一、什么是事务的传播行为 二、7种事务传播行为 1. REQUIRED 2. REQUIRES_NEW 3. NESTED 4. 总结 三、事务的传播行为&#xff08;理解记忆&#xff09; 转载&#xff1a;一个99%的人都说不清楚知识点——Spring 事务传播行为 - 哔哩哔哩 事务属性…

2023.7.7HCIA中静态路由

一、题目要求 需求&#xff1a; 1.所有节点的IP地址均属于192.168.1.0 24--子网划分 2.全网可达--静态 3.加快收敛&#xff08;尽量汇总&#xff09; 5.R6存在环回接口--6.6.6.6 24&#xff0c;不能直接写去往6.6.6.0网段的路由--缺省 6.没有环路--NUll 0 7.正常流量走100M&am…

什么是ERC20?

ERC20 是以太坊区块链上最常见的代币标准之一。它是以太坊上智能合约的一种协议&#xff0c;定义了一套规则和接口&#xff0c;使得在以太坊网络上创建和管理代币变得更加简单和标准化。 ERC20 代币标准定义了一组功能和方法&#xff0c;以便代币合约可以与其他合约和钱包进行…