js实现纯前端压缩图片

news/2024/11/23 5:26:56/

演示

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>压缩图片</title>
</head>
<body>
<input id='file' type="file">
<script>var eleFile = document.querySelector('#file')var file;var render = new FileReader(), img = new Image();render.onload = function(e) {img.src = e.target.result}// 获取图片文件eleFile.addEventListener('change', function(e) {file = e.target.files[0];if(file.type.indexOf('image') === 0) {//读取文件,并返回一个URL格式的Base64字符串render.readAsDataURL(file)}})//使用canvas把图片画出来var canvas = document.createElement('canvas');var context = canvas.getContext('2d');img.onload = function() {//原始尺寸var originWidth = this.width;var originHeight = this.height;//最大尺寸限制var maxWidth = 200, maxHeight = 200// 目标尺寸var targetWidth = originWidth, targetHeight = originHeight;//当原始尺寸大于200*200时候if(originWidth > maxWidth || originHeight > maxHeight) {if(originWidth / originHeight > maxWidth / maxHeight) {//更宽targetWidth = maxWidth;targetHeight = Math.round(maxWidth * (originHeight / originWidth))}else {targetHeight = maxHeight;targetWidth = Math.round(maxHeight * (originWidth / originHeight))}}//画图canvas.width = targetWidth;canvas.height = targetHeight;//清除画布context.clearRect(0,0,targetWidth, targetHeight)//图片压缩context.drawImage(img, 0, 0, targetWidth, targetHeight);//canvas 转为blob并上传canvas.toBlob(function(blob) {try {var xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {{if(xhr.status == 200) {}}}//开始上传xhr.open('POST','upload.php', true);xhr.send(blob)} catch (error) {console.log(error)}}, file.type || 'image/png')//在页面预览原图片var div1 = document.createElement('div')div1.innerText = '原图:'document.body.appendChild(div1)document.body.appendChild(img)//canvas预览var div2 = document.createElement('div')div2.innerText = 'canvas图:'document.body.appendChild(div2)document.body.appendChild(canvas)}</script>
</body>
</html>

分析:原理是用canvas的生成的图片,控制其大小来进行图片的压缩,需要注意的是,如果图片的尺寸太小,会导致图片模糊,使用时候,注意设置其比例控制。

1、通过FileReader读取图片文件,用 Image来装图片url(可以用来预览)
2、转化成base64字符串模式
3、通过maxWidth,MaxHeight和比例来控制最终的canvas的宽高 4、用canvas画图
5、在把canvas输出blob文件,进行上传


http://www.ppmy.cn/news/9860.html

相关文章

基于yolov5-v7.0开发构建裸土实例分割检测识别模型

yolov5在v7.0的版本中加入了对图像实例分割的全面支持&#xff0c;这里主要就是想基于v7.0的分支来开发构建裸土分割模型&#xff0c;其实在实际计算的时候模型是可以连带着检测任务一起输出结果的&#xff0c;这里我从结果形式上面直观来看应该就是在推理阶段直接基于分割的结…

TCP/IP协议

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 应用层 XML json ​编辑 protobuffer 传输层 UDP的数据报文格式 TCP报文格式 TCP的可靠传输 确认应答&#xff08;安全机制&#xff09; …

养老院人员定位方案125K芯片AS3933/SI3933/GC3933/PAN3501

随着社会老龄化&#xff0c;高龄化&#xff0c;空巢化和病残化的迅速发展&#xff0c;将使得越来越多的老人住进养老院。虽养老院数量越来越多&#xff0c;但养老院人也越来越多&#xff0c;给现有的养老管理上带来压力&#xff0c;由于服务人员有限&#xff0c;无法及时顾及到…

通关手册 | 祝我通关成功!!!

Framework of MLLoss on training data1. large1.1 Model Bias1.2 Optimization2. smallLoss on testing data2.1 large2.1.1 overfitting2.1.2 mismatch2.2 small通关手册&#xff1a;祝我通关成功&#xff01;&#xff01;&#xff01; Loss on training data 1. large 1.1…

nVisual自动计算线缆长度

nVisual创建线缆后&#xff0c;需要对线缆长度进行计算&#xff0c;比如室外场景下光缆长度的测量及室内综合布线长度测量。nVisual可实现线缆生成后自动线缆长度的计算和手动测量线缆长度。本章将介绍测量长度接口的具体实现思路及接口调用。 一、计算原理 1.区分场景 nVis…

C语言-数据的存储-浮点数的存储(8.2)​​​​​​​

目录​​​​​​​ 思维导图&#xff1a; 浮点型在内存中的存储 1.1一个经典的例子 1.2 浮点数存储规则 1.3实践举例 写在最后&#xff1a; 思维导图&#xff1a; 浮点型在内存中的存储 1.1一个经典的例子 #include <stdio.h>int main() {int n 9;//以整形的形式…

【寒假每日一题】AcWing 4652. 纸张尺寸

目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 一、题目 1、原题链接 4652. 纸张尺寸 - AcWing题库 2、题目描述 在 ISO 国际标准中定义了 A0纸张的大小为 1189mm841mm&#xff0c;将 A0纸沿长边对折后为 A1 纸&#xff…

Dropzone4 for MAC 文件拖拽增强工具

前言 ​​Dropzone for mac是一款文件拖拽操作增强工具&#xff0c;可以让我们把大部分工作都通过拖拽来完成&#xff0c;只需将文件拖拽到菜单栏上的窗口即可。比如保存文本、发送邮件、FTP上传、打开应用等等。提高了用户的工作效率。 下载 Dropzone4 特征 -打开应用程序…