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

Mac用户解决WPS中的俄语显示红线问题(WPS添加外语拼写检查)

我所使用的WPS版本:AppleStore 下载的 MacOs版 3.3.0 首先,对于 在访达-应用程序中,找到WPS,右键-点击“显示包内容” 然后按照下图的索引目录(Contents\Resource\office6\dicts\spellcheck),最后进入一个叫“spellcheck”的文件夹 最后将下载好的字典包(例如上图中的 en_US就代表美式英语;ru_RU就代表俄语) 关于字典包资源下载,我在网上找到一个Google云盘,里面包含了法语,德语,西语,意大利语,葡萄牙.

qq_48159150的博客 7897

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

React图片压缩上传统一处理

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

weixiaohuai的博客 5094

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

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

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1085

量化人必看|miniQMT踩坑记:回测太慢?一招教你把行情数据“搬回家”!

这篇文章主要聊的是。

奔跑的蜗牛 3478

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

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

weixin_34396902的博客 407

【LVGL】从HTML到LVGL:嵌入式UI的设计迁移与落地实践

嵌入式UI迁移实践:从HTML到LVGL 本文介绍了将HTML/CSS设计的UI原型迁移到嵌入式系统(LVGL)的完整流程,重点涉及"HTML→Figma→LVGL"的三步转换方法。具体内容包括: 设计迁移流程:通过Figma作为中间桥梁,将HTML原型转化为标准设计资产,再适配到LVGL库; 工具与参数准备:详细列出了设计迁移所需的工具链和需要提取的核心设计参数; Figma还原步骤:分组件讲解如何在Figma中1:1还原HTML设计,包括标题栏、压力显示区、图表区等核心组件; LVG

ymlmail的博客 1973

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

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

398

【网络协议】【TSN】精讲TSN工作原理!图解超赞超详细!!!

TSN有一个服务等级(class of service,CoS)的概念。对TSN网络而言,不同优先级的服务对应图3中的PCP码。3位PCP码定义了0(最低)~7(最高)这8个优先级,传输类型分别对应基础、最大努力、卓越努力、严苛应用、延时和抖动小于100 ms的视频、延时和抖动小于10 ms的音频、内部网络控制、网络控制。其会对网络场景进行不同的匹配,是后续调度、配置设计中会考虑到的数据流调度因素。

风云说通信 2632

【Claude Code 源码解析教程】第4章:QueryEngine 查询引擎

本章深入解析 Claude Code 的核心引擎——QueryEngine,它是整个对话系统的"心脏",负责管理会话状态、消息处理流程和多轮对话支持。

rengang66的博客 269

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

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

weixin_33749131的博客 397

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

斌擎科技 834

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

React H5图片压缩上传

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

SoulKey的博客 1714

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在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、付费专栏及课程。

余额充值