vue,react,js 图片上传前对图片进行压缩,主要用于头像上传(利用canvas重绘图片已达到压缩效果)

ReactJS & antd 环境中项目上传图片后压缩(lrz的使用) lrz说明 用于:在客户端压缩好要上传的图片可以节省带宽更快的发送给后端,特别适合在移动设备上使用。 解决了很多问题:图片扭曲、某些设备不自动旋转图片方向,没有jpeg压缩算法.. 不支持new Blob,formData构造的文件size为0.. 还有某些机型和浏览器(例如QQX5浏览器)莫名其妙的BUG.. 按需加载(会根据对应设备自动异步载入JS文件,节省不必要带宽) 原生JS编写,不依赖例如 阅读详情

实现原理:


新建一个web api中FileReader对象,去读取本地选中的图片,新建image对象去记录选中图片的基本信息(如: width,height等),新建"canvas"标签,利用Image对象记录的数据在"canvas"上重绘一个图片,然后再将图片转成base64编码,再处理成Blob类型返回即可

具体如下(以下例子使用的是 element-ui的上传组件)

在上传文件时,监听选中图片后、上传之前的事件

//	这是在vue中的template里的代码
<el-upload
    ref="upload"
    <!-- //     上传地址 --></el-upload>
    action="https://jsonplaceholder.typicode.com/posts/"
    <!-- //  是否支持多选文件 -->
    :multiple="false"
    name="fileName"
    <!-- //  数据 -->
    :data="uploadData"
    <!-- //  上传成功回调 -->
    :on-success="uploadSuccess"

    <!-- //  重点是监听下面的上传前的事件  -->
    <!-- //  上传前的回调 -->
    :before-upload="uploadHandle"
  ></el-upload>

监听上传前的回调,会有一个file形参,里面有上传文件的路径等信息

//  文件上传前处理
      uploadHandle(file){
        //  判断文件大小是否大于300kb,小于则不做处理
        if (file.size <= 327200){
          return
        }
        //  返回一个promise对象
        return new Promise(resolve => {
          //  用于读取本地文件的对象
          const reader = new FileReader()
          //  用于存储选中图片的基本信息
          const image = new Image()
          image.onload = (imageEvent) => {
            //  创建canvas标签元素
            const canvas = document.createElement('canvas')
            //  制定绘制的类型 这边指定的是2d类型
            const context = canvas.getContext('2d')
            //  imgQuality 指缩放的比例,我这边设置了0.5,最好用变量去定义,这样容易维护
            const width = image.width * this.imgQuality  // 0.5
            const height = image.height * this.imgQuality // 0.5
            canvas.width = width
            canvas.height = height
            //  清除canvas的矩形内容(将canvas上的东西清除)
            context.clearRect(0,0,width,height)
            //  在canvas中,按指定的比例去画出图片
            context.drawImage(image,0,0,width,height)
            //  将canvas画出的图片转成base64
            const dataUrl = canvas.toDataURL(file.type)
            //  把base64 dataUrl格式转换成blob类型(dataUrlToBlob方法在下面)
            const blobData = this.dataUrlToBlob(dataUrl,file.type)
            //  返回blobData进行上传
            resolve(blobData)
          }
          //  读取完文件后,将图片的路径存到新建的image上
          reader.onload = (e => {image.src = e.target.result})
          //  根据路径读取选中的文件
          reader.readAsDataURL(file)
        })
      },
      
      //  把base64 dataUrl格式转换为blob类型
      dataUrlToBlob(dataUrl,type){
        //  使用window的atob方法去解码base64
        let binary = atob(dataUrl.split(',')[1])
        let arr = []
        //  转unicode编码
        for (let i = 0; i < binary.length; i++) {
          arr.push(binary.charCodeAt(i))
        }
        //  通过unicode编码去创建Blob类型
        return new Blob([new Uint8Array(arr)],{type})
      }
前端图片压缩实战:compressorjs原理、配置与性能优化指南 图片压缩是现代Web开发中的关键技术,通过算法优化减少图片文件体积。其原理主要基于有损压缩和无损压缩两种方式,有损压缩通过舍弃人眼不敏感的视觉信息实现大幅减容,无损压缩则通过编码优化保持原始质量。在前端进行图片压缩具有重要技术价值,能够显著降低服务器带宽成本,提升用户上传体验,减少页面加载时间。常见的应用场景包括用户头像上传、社交媒体图片分享、电商商品展示等需要处理用户生成内容的Web应用。compressorjs作为专门的前端图片压缩库,基于Canvas API实现浏览器端高质量压缩,支持JPEG、PNG 阅读详情

相关推荐

美图前端面试全流程复盘:基础原理、React优化与项目实战

前端面试中,事件循环与闭包是绕不开的基础考点,它们决定了异步编程和状态管理的正确性。理解宏任务与微任务的执行顺序,掌握闭包对作用域与内存的影响,是构建高性能应用的前提。而浏览器缓存机制则直接影响页面加载速度与用户体验,是性能优化的重要环节。从这些基础概念出发,结合图片懒加载、React渲染优化、防抖节流等实战技术,能够有效提升前端工程能力。本文完整复盘美图前端面试的考察脉络,从事件循环讲到项目架构,帮助读者深入理解每个问题背后的设计意图。

weixin_34059951的博客 472

完整的前后端 实现上传头像、压缩头像

本文是我在写上传头像功能后的一个详细的总结,用作以后可以回顾,可能较为繁琐,如果明白上传只想看压缩,可直接拉到文章后半部分。 文章目录上传头像上传头像准备工作上传头像上传头像路由配置上传头像接口前端修改图片名压缩头像压缩的原因压缩压缩操作的流程几个方法的说明具体代码的详细分析context.drawImage()压缩方法说明 上传头像 上传头像准备工作 在后台/public文件夹里 创建一个文件夹...

Reagan_的博客 7955

微信小程序校园二手书项目实战:从数据库设计到上线避坑指南

在校园场景下,二手书交易的核心在于信息撮合效率,而微信小程序以其免安装、即用即走的特点成为最合适的载体。开发者通过微信登录体系即可快速构建用户身份,无需自建账号系统。后端采用Spring Boot与MySQL的组合,搭配MyBatis-Plus减少重复CRUD,数据库设计需兼顾搜索、订单与收藏等核心功能,避免后期返工。全文检索与多条件筛选结合,能有效提升书籍查找体验;交易状态机则用于管理在售、预约到售出的完整链路。针对支付环节,个人开发者需注意资质限制,可采用模拟支付或线下交易模式完成演示。上线审核时,类目

weixin_34293141的博客 341

vue/react通用上传前图片压缩

js压缩上传

weixin_46410505的博客 432

Android开发者必看:5分钟搞定DeepSeek API接入(附完整代码示例)

本文为Android开发者提供快速接入DeepSeek API的完整指南,包含环境配置、网络层设计、请求体构建等关键步骤,并附有详细代码示例。通过工程化实践,帮助开发者高效集成AI对话、代码生成等高级功能,提升移动应用竞争力。

bush的博客 535

STM32CubeMX+Keil5实战:手把手教你用STM32F103C8T6开发扫地机器人(附完整代码)

本文详细介绍了如何使用STM32F103C8T6开发智能扫地机器人,从STM32CubeMX配置到Keil5代码实现的全过程。涵盖硬件选型、时钟树配置、GPIO外设设置、电机驱动、超声波测距及自动避障算法等核心内容,并提供完整代码示例,助力开发者快速掌握智能硬件开发技巧。

weixin_30329623的博客 81

React图片压缩上传统一处理

一、简介 最近项目需要对上传的图片文件进行压缩后才上传到服务器中,于是研究了一番,下面给出详细的压缩方法,笔者使用的是React Ant Design前端框架的Upload组件上传图片: 通过查看Ant Design官网文档,在上传文件前可以修改文件: transformFile 在上传之前转换文件。支持返回一个 Promise 对象 Function(file):st...

weixiaohuai的博客 5094

Mac上Office合法安装与激活全指南:2021/2024/M365区别解析

Office是微软办公套件的核心产品,其在macOS平台的部署逻辑与Windows截然不同——不依赖传统密钥激活,而是基于Microsoft账户与设备标识的云端绑定机制。理解这一原理,是解决‘无法验证开发者’‘打不开’‘功能受限’等常见问题的前提。Office 2021代表永久许可模型,Office 2024 LTSC面向企业离线场景,Microsoft 365则是持续订阅服务,三者在授权验证方式、更新策略与系统兼容性上存在本质差异。实际应用中,需结合macOS版本、芯片架构(Intel/Apple Sil

weixin_33491377的博客 1270

antd upload 图片上传前压缩

onChange = (files, type, index) => { const newItem = _.cloneDeep(this.state.imgData); if (type === "add") { const file = [...files].pop().file; const newitem = [...files].pop(); // 多次上传之前的数据 const handle = this.handleUPdata;..

Mine____的博客 2805

PMSM无感foc控制(滑模-反正切-PLL)【仿真模型搭建教程】(附模型)

本文主要目的是教大家如何把文献中的公式转换成仿真模型。 首先介绍滑模控制的原理及如何搭建simulink模型。 1.1基于反电势估计位置原理 永磁同步电机在静止坐标系αβ下的电压方程: 扩展反电动势包含转子位置信息,并且αβ轴下扩展反电动势的反正切函数正好就等于位置角theta。 1.2 滑模控制原理(比较重要的点是以电机电流模型推导展开) 通过滑模观测得到鲁棒性比较高的αβ轴下扩展反电动势,并求其反正切函数,得到位置信息。 /*********************...

weixin_44769876的博客 1万+

ubuntu20.04安装Qt5.15.2并配置环境

qt官方取消了离线安装的方式,所以推荐在线安装,当然,如果想要自己通过源码编译也可以,参考官方文档:https://wiki.qt.io/Building_Qt_5_from_Git。 在线安装: 1.到官方网站下载:wget https://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run 2.修改文件权限:chmod 777 qt-unified-linux-x64-online.run

f120854632的博客 8807

前端图片处理实战:使用小红帽库实现头像上传与多尺寸适配

图片处理是现代Web开发中的基础技术需求,其核心原理是通过算法对图像数据进行变换和优化。在前端开发中,图片处理技术能够显著提升用户体验,减少服务器压力,实现实时预览效果。JavaScript图片处理库通过Canvas API和浏览器原生能力,提供了裁剪、缩放、压缩等核心功能。以用户头像上传场景为例,开发者需要解决不同尺寸适配、格式转换、性能优化等工程实践问题。小红帽图片处理库作为一个轻量级解决方案,具备零依赖、API简洁、功能全面等技术特点,特别适合头像裁剪、图片压缩等常见需求。该库支持多种安装方式,包括C

weixin_34396902的博客 407

图像分割 - 使用Mask R-CNN模型在COCO数据集上进行图像分割任务

图像分割是计算机视觉领域的一个重要任务,它旨在将图像中的每个像素分类为对象或背景。Mask R-CNN是一种基于区域的卷积神经网络,可用于图像分割任务。它是Faster R-CNN的扩展,将目标检测与图像分割结合起来,能够同时检测和分割对象。在本博客中,我们将使用Mask R-CNN模型在COCO数据集上进行图像分割任务。我们将介绍如何下载和准备COCO数据集,以及如何使用Mask R-CNN模型进行训练和推理。

斌擎科技 1189

微信小程序实战开发:前端本地证件照换底色项目完整落地复盘(从零注册到上线全流程+避坑汇总)

在日常求职、教资考试、公考报名、证件办理等场景中,证件照换底色是绝对高频的刚需操作。但长期使用各类工具后,我发现市面上几乎所有免费/付费工具都存在无法根治的痛点:在线网页工具强制上传原图、留存人脸数据,隐私泄露风险极高;专业PS操作门槛高、耗时久;Python脚本适合练手、不适合普通用户;商用小程序大多捆绑广告、强制登录、底色参数不标准,极易导致报名审核失败。基于以上真实痛点,我从零独立开发了一款纯前端本地处理、无服务端存储、零授权、零广告、标准化色值的证件照换底色微信小程序。

398

Windows 11 安装 uv:手动下载、配置国内源

本教程详细介绍了在 Windows 11 系统下安装并配置 Python 包管理器 uv 的完整流程,包括配置环境变量 PATH、设置清华 PyPI 镜像源,以及创建收据文件以支持未来更新。适用于因网络限制无法通过官方脚本自动安装的用户,操作步骤清晰,配有图文指引,帮助读者高效完成本地部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7609

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Gemini 2.5 Pro:手绘草图生成可运行Web应用的UI新范式

UI生成正从‘代码补全’迈向‘意图直译’阶段——多模态大模型通过理解手绘草图与自然语言描述,直接输出可交付的Web应用。其核心原理在于跨模态对齐构建视觉-语义联合嵌入空间,并结合工程上下文感知实现原生HTML/CSS/JS或p5.js等轻量框架的零配置落地。这种能力显著降低交互原型开发门槛,尤其适用于教育编程、快速验证、创意编码及前端协作场景;p5.js因其‘视觉即逻辑’的API设计,成为当前最适配该范式的前端技术栈之一。

weixin_33749131的博客 397

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

基于YOLO的车辆类型检测系统:deepseek+千问+YOLOv8/YOLOv10/YOLOv11/YOLOv12/YOLO26模型对比|Vue3+SpringBoot+Flask+MySQL网页版

回到开头那个问题:为什么又做了一个车辆检测系统?市面上的车辆检测 Demo 多的是,但真正把"多模型对比 + 完整业务闭环 + 可追溯记录 + 在线训练"这几件事凑齐的,其实不多。这套系统的价值不在于"它能检测车辆"——这事儿随便一个 YOLO Demo 都能干——而在于它把检测做成了一个可运营、可治理、可演进的平台。对使用者来说,它是一个能直接拿去演示和落地的车辆类型检测产品;对研究者来说,它是一个 YOLO 多版本横向对比的实验台;

斌擎科技 834

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

React H5图片压缩上传

目录 第一步:获取file文件 第二步:将获取的文件进行base64编码 第三步:利用canvas压缩图片 第四步:将压缩后的base64编码图片转为File类型 第五步:利用FormData上传 第一步:获取file文件 默认已获取到用户选择的图片File,请参考其他资料。 File文件内容参考如下图,如果你拿到这样的数据,这一步就完成了。 第二步:将获取的文件进行base64编码 如下图 imgBase64就是base64编码之后的图片,这里注意this指向问题 get.

SoulKey的博客 1714

在React中利用compressorjs对图片进行压缩上传

在React中对图片进行压缩上传 图片压缩需要用到插件 compressorjs, https://www.npmjs.com/package/compressorjs 需要注意的是这个插件是利用canvas对图片进行重绘,如果压缩太过的话,会导致一定程度上的图片失真。 首先创建input标签 <input id='age' type="file" ref='tw...

weixin_44517846的博客 2958

React(一):基于input的图片上传结合canvas实现图片压缩

图片压缩的功能,基于以下一些知识点: input的file类型 react的传值机制 子盒子如何在父盒子中居中

Sheyami的代码乐园 1272

react打包通过image-webpack-loader插件对图片压缩优化

react正常打包之后一些图片文件很大,使打包体积很大,通过image-webpack-loader插件可将大的图片进行压缩从而缩小打包体积 step1:npm install image-webpack-loader --save-dev step2:在config/webpack.config.prod.js中改如下配置 module.exports = { module: {...

przlovecsdn的博客 3108

使用Blob进行文件上传

Blob,Binary Large Object的缩写,二进制类型的大对象,代表不可改变的原始数据 Blob基本用法 Blob对象 Blob对象指的是字节序列,并且具有size属性,是字节序列中的字节总数,和一个type属性,它是小写的ASCII编码的字符串表示的媒体类型字节序列。 size:以字节数返回字节序列的大小。获取时,符合要求...

weixin_34128534的博客 5037

通过JS将图片File转为base64并压缩

后端为了方便需要直接将图片存储为base64,但图片过大时转出的base64过长,因此前端需要对转后的base64进行压缩 话不多说,直接上代码 /** * * @param {需要转换的图片file} file * @param {是否返回压缩后的base64} isCompression * @param {转换成功后通过回调函数将结果返回} callback */ export function imageToBase64(file, isCompression, callbac.

sinat_21902709的博客 1578

用element的upload组件实现多图片上传和压缩

前端我用element-ui的Upload组件作为基础,vuex做状态管理。后端用的是Django和django-rest-framework。七牛云作为图床。 项目地址:多图片上传组件 效果展示 项目执行流程 首先,让我们来分析一下实现多图片上传的流程: 前端向后端请求用来上传图片至服务器的token 后端为每张要上传的图片生成一个图片名,并用这个图片名生成token 后端将图片名...

m0_37937502的博客 2316

React文件及头像上传

头像上传 啊标签download属性跨域

song279811799的博客 1万+
上一篇: webpack打包js文件,兼容处理ES6、ES7等语法
下一篇: Vue 总结:组件间的通讯方式(父子传参、兄弟传参、任意两个组件间传参、多个组件嵌套传参)
Wilson_gzw
博客等级 码龄7年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值