Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端图片压缩及上传

前端图片压缩及上传

作者头像
OECOM
发布于 2020-07-02 03:46:07
发布于 2020-07-02 03:46:07
3K00
代码可运行
举报
文章被收录于专栏:OECOMOECOM
运行总次数:0
代码可运行

图片的上传一般情况下不需要上传大体积的图片,因为如果是用户头像或者是一些要求清晰度不是太高的场景上传大体积图片会很消耗资源,一个是上传耗时比较长,同时也增加了存储的开销,当展示的时候也会消耗下载的带宽,影响加载效率。要求用户上传的图片之前压缩图片很影响用户体验,所以就增加了在前端进行图片压缩的需求。

压缩方案

前端图片压缩的主要思路就是将图片绘制到canvas中,然后通过canvas的toDataURL方法来控制图片的质量,对图片进行压缩,另一方面是对图片进行宽高等比缩小来达到图片压缩的效果,下面来看一下代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 resizeMe(img,type, max_width, max_height) {
        var canvas = document.createElement('canvas');
        var width = img.width;
        var height = img.height;
        max_width = !isNaN(max_width)?max_width:0;
        max_height = !isNaN(max_height)?max_height:0;
        // 在这里图片是等比例缩放的,调用方法时填入图片允许的最大宽度或者是最大的高度
        //如果最大宽度为0 则按照最大高度固定,宽度自适应的方式来实现
        //如果是最大高度为0,则按照最大的宽度来实现
        if(max_width==0){
            if (height > max_height) {
                width = Math.round(width *= max_height / height);
                height = max_height;
            }
        }
        if(max_height==0){
            if (width > max_width) {
                height = Math.round(height *= max_width / width);
                width = max_width;
            }
        }
        canvas.width =width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        canvas.width =width;
        canvas.height = height;
        ctx.drawImage(img,0,0, width, height);
        type = type === 'jpg'?"jpeg":type;
        return canvas.toDataURL("image/"+type, 0.7);//这里的0.7值的是图片的质量
  }

在上面的代码中,我们传入的参数主要有image对象,图片类型,图片的最大宽度和最大高度。调用方法时填入图片允许的最大宽度或者是最大的高度,进行等比绘制到canvas中,然后通过toDataURL来转换成base64格式返回,此时的图片就是压缩过后的图片。

创建image对象

上面的示例说了图片压缩的过程,其中有一个参数是image对象,那么这个image对象是如何来的呢。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
selectFileImage(el){
     var reader = new FileReader();
    var file = el.target.files[0]
    var fileName = file.name;
    var fileType = file.name.split(".")[1];
        reader.readAsArrayBuffer(file);

        reader.onload = (ev) => {
            var blob = new Blob([ev.target['result']]);
            window['URL'] = window['URL'] || window['webkitURL'];
            var blobURL = window['URL'].createObjectURL(blob);
            var image = new Image();
            image.src = blobURL;
            image.onload = (e) => {
                var thumb = this.resizeMe(image,fileType, 400, 0);//获得的路径是将图片转换成了base64
                axios.post("http://127.0.0.1:3003/useasync/upload",{file:thumb,fileName:fileName}).then(res => {
                    if (res.data.code == 200) {
                       console.log(res)
                    } else {
                        console.log(res)
                    }
                });
            }
        }
    }

在这里面我使用了一个FileReader对象,FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

当触发input的onChange事件后,可以读取到input中的file文件,于是将此文件读取到缓存当中,当读取完成后,result属性中保存的将是被读取文件的ArrayBuffer数据对象。这里我们可以看一下读取完成后的这个ev到底是个什么东西

我们可以看到这里面loaded和total都表示的是文件的总大小,重要的其实是target和currentTarget,这两个属性其实是一样的,里面包含了读取的fileReader对象,里面的result就是缓存中的数据了,我们通过new 一个Blob对象,将其转换为Blob对象,然后就可以通过url方法来将其转换为可以放到img src中的链接形式了。此时创建image对象,并对其src进行赋值,当image加载完成后,就开始调用压缩方法,传入的image对象就是我们刚才生成的image对象。

当压缩完成后返回的数据就是base64的数据了,我们就可以通过ajax异步来进行上传,在此我采用的是axios进行异步上传,将内容及文件名作为参数传递给后台。

后台接收

在这我才用的示例为nodejs搭建后台来接收图片,这里我们需要一个bodyParser模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.use(bodyParser.json({ limit:'5mb'}));//限制允许提交的大小

将大小限制为5M以内,也就是说通过base64上传的图片大小一定要小于5M才能成功,这个参数我们可以随意更改,按业务需求而定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
router.post("/upload",function(req,res){
    var imgData = req.body.file;
    var fileName =  req.body.fileName;
    var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
    //var size = Buffer.byteLength(base64Data,'base64');
    //var dataBuffer = Buffer.alloc(size,base64Data, 'base64');
    var dataBuffer = Buffer.from(base64Data, 'base64');
    fs.writeFile(process.cwd()+"/upload/"+fileName, dataBuffer, function(err) {
        if(err){
            res.json({success:false,errormsg:err});
        }else{
            res.send({success:true,msg:"保存成功!"});
        }
    });
})

接口中我们通过Buffer来将base64转换为buffer,进而保存到服务器本地中,本示例采用的就是将图片保存到服务器本地。如此通过将base64编码图片保存为图片就做完了。

由于压缩采用的是canvas,获取文件等是通过FileReader 对象及Bolb对象,故此方法目前的兼容性最低为IE10,还请酌情使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
html5前端图片压缩
如今手机像素越来越高,造成拍出来的照片越来越大,随便拍一张就好几兆,于是乎就有了一种需求就是压缩图片,在之前压缩图片的功能是在后台操作的,之后前端亦可以进行图片的压缩功能。
OECOM
2020/07/02
3.8K0
前端实现图片压缩干货分享
在Web开发中,图片压缩是一个常见且重要的需求。随着高清图片和多媒体内容的普及,如何在保证图片质量的同时减少其文件大小,对于提升网页加载速度、优化用户体验至关重要。前端作为用户与服务器之间的桥梁,实现图片压缩的功能可以显著减轻服务器的负担,加快页面渲染速度。本文将探讨前端实现图片压缩的几种方法和技术。
用户10501441
2024/11/24
3910
前端实现图片压缩干货分享
【Web技术】907- 前端图片最优化压缩方案
上传图片/视频/文件是我们经常会遇到的问题,但是一旦图片过大就会导致不好的操作体验。图片上传是前端中常见的的业务场景。无论是前台还是后台,适当的对图片进行压缩处理, 可以显著的提升用户体验。而在后台管理系统中,图片压缩不仅仅能够提升后台管理员操作体验,更是可以防止后台设置过大的图片导致前台图片加载过久,从而影响用户体验。
pingan8787
2021/04/07
1K0
【Web技术】907- 前端图片最优化压缩方案
使用canvas在前端压缩图片实例页面
HTML代码: <input id="file" type="file"> JS代码: var eleFile = document.querySelector('#file'); // 压缩图片需要的一些元素和对象 var reader = new FileReader(), img = new Image(); // 选择的文件对象 var file = null; // 缩放图片需要的canvas var canvas = document.createElement('canvas'); va
李维亮
2021/07/08
4450
# 前端图片压缩方案
先通过 js 中 img 构造函数,实例化 img 对象,后将图片的路径给转移到中,再建立一个 canvas 画布,后对画布进行各方面的数值的设置。
九旬
2023/10/19
2910
面试官昨天问我对base64的理解,着实被问懵了
我们知道一个字节可表示的范围是 0 ~ 255(十六进制:0x00 ~ 0xFF), 其中 ASCII 值的范围为 0 ~ 127(十六进制:0x00 ~ 0x7F);而超过 ASCII 范围的 128~255(十六进制:0x80 ~ 0xFF)之间的值是不可见字符。
用户3806669
2021/03/25
4.8K0
面试官昨天问我对base64的理解,着实被问懵了
Vue 图片压缩并上传至服务器
本文主要讲解基于 Vue + Vant ,实现移动端图片选择,并用 Canvas 压缩图片,最后上传至服务器。还会封装一个工具类,方便直接调用。
solocoder
2022/04/06
2.5K0
Vue 图片压缩并上传至服务器
如何用 JavaScript 制作一个好用又好玩的图片压缩工具
现在的设备发达了,图片拍下来动辄 5MB 10MB,单反相机歘欻欻一张经能达到 40MB,手机的内部储存也跟着很大,随便一个手机都 100G 。
独元殇
2023/03/21
1K0
如何用 JavaScript 制作一个好用又好玩的图片压缩工具
开发实例:后端Java和前端vue实现图片管理功能
2. 通过input[type=file]元素上传图片,使用element-ui的Upload组件进行封装。
用户1289394
2024/01/19
7380
开发实例:后端Java和前端vue实现图片管理功能
vue.js + axios.js图片压缩处理并上传到服务器demo
点击查看效果 图片压缩原理 将图片重新画入一个canvas中。可设置最大宽度,再按图片宽高比例定义canvas画布的宽高。 完整代码demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传图片</title> <meta name="renderer" content="webkit"> <meta name="viewport" content="widt
别盯着我的名字看
2022/06/09
5.7K0
图片转换js (img对象,file对象,base64,canvas对象),以及图片压缩方式(转载)
首先想一想我们有哪些需求?大多时候我们需要将一个File对象压缩之后再变为File对象传入到远程图片服务器;有时候我们也需要将一个base64字符串压缩之后再变为base64字符串传入到远程数据库;有时候后它还有可能是一块canvas画布,或者是一个Image对象,或者直接就是一个图片的url地址,我们需要将它们压缩上传到远程;
李维亮
2021/07/08
4.9K0
《你不知道的 Blob》番外篇
原文对 Blob 的知识点介绍得非常完整清晰,本文通过四个问题来总结本文核心知识:
pingan8787
2020/06/08
2.7K0
Canvas 进阶(六)实现图片压缩功能
因此我们设计一个 imageCompress 类,传入一个 option, 其参数有:
小皮咖
2020/02/25
1.4K0
Canvas 进阶(六)实现图片压缩功能
Vue实现剪切板图片压缩
监听剪切板粘贴事件,读取剪切板中的图片文件,转成base64通过img标签显示出来,此时可能会存在剪切板中图片过大,产生上传速度慢问题,接下来就跟大家分享下如何将base64图片进行压缩。先跟大家展示下最终实现的效果:
神奇的程序员
2022/04/10
1.2K0
Vue实现剪切板图片压缩
前端图片压缩
HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。
码客说
2022/12/01
2.9K0
前端:Canvas进行简单图片压缩算法
图片压缩算法 通过canvasAPI进行在Web端上传的时候进行图片压缩。 通过宽高压缩(第一次压缩 - Canvas宽高) 通过API压缩(第二次压缩 - HTMLCanvasDom.toDataURL()) 简述步骤 通过input输入框用来坐上传,通过chang事件获得上传的文件。 对上传的文件进行一些简单的类型,大小的判断然后开始压缩。 压缩图片第一步将用户上传的图片(file)转为base64格式-new FileReader() -> ReaderAsDataUrl()异步读取
19组清风
2021/11/15
1.9K0
图片上传前预处理,等比缩放、裁剪 (html5 + canvas)
本文作者:IMWeb capricorncd 原文出处:IMWeb社区 未经同意,禁止转载 Image pre processing for upload (html5 + canvas) 源码
IMWeb前端团队
2018/01/08
3.7K0
图片上传前预处理,等比缩放、裁剪 (html5 + canvas)
移动拍照上传图片实现图片压缩
手机拍照一般手机需要5m大小的内存上传过程需要流量大,上传时间长的问题,为更好的用户体验需要对图片进行压缩。
用户6379025
2022/12/26
1.9K0
图片处理不用愁,给你十个小帮手
本文阿宝哥会为小伙伴们隆重介绍用于图片处理的十个 “小帮手”,他们各个身怀绝技,拥有模糊、压缩、裁剪、旋转、合成、比对等技能。相信认识他们之后,你将能够轻松应对大多数的图片处理场景。
阿宝哥
2020/06/23
5.3K0
手把手教你实现一个图片压缩工具(Vue与Node的完美配合)
图片压缩对于我们日常生活来讲,是非常实用的一项功能。有时我们会在在线图片压缩网站上进行压缩,有时会在电脑下软件进行压缩。那么我们能不能用前端的知识来自己实现一个图片压缩工具呢?答案是有的。
Vam的金豆之路
2021/12/01
8260
手把手教你实现一个图片压缩工具(Vue与Node的完美配合)
推荐阅读
相关推荐
html5前端图片压缩
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验