如何使用canvas压缩图片大小
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"如何使用canvas压缩图片大小",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用canvas压缩图片大小"吧!问题来源这个问题,源
千家信息网最后更新 2026年11月03日如何使用canvas压缩图片大小
本篇内容主要讲解"如何使用canvas压缩图片大小",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用canvas压缩图片大小"吧!
问题来源
这个问题,源于上传图片文件的时候,后台限制了2MB的大小,but在调起相机拍照的时候分分钟超过了2MB,为了不影响用户体验和功能需求,需要前端对大小进行压缩,然后传到后台。
思路分析
找了很多资料,发现只有canvas可以对图片进行压缩处理。
原理大概就是: 1、先将图片的file文件转成baseURL 2、创建一个image标签去接收文件获取图片的宽高和比例。 3、创建canvas画布设置画布的大小。 4、将图片绘制到canvas上面。 5、对canvas进行压缩处理,获得新的baseURL 6、将baseURL转化回文件。
前提的函数
将file文件转化为base64
/*** @param {二进制文件流} file * @param {回调函数,返回base64} fn */function changeFileToBaseURL(file,fn){ // 创建读取文件对象 var fileReader = new FileReader(); //如果file没定义返回null if(file == undefined) return fn(null); // 读取file文件,得到的结果为base64位 fileReader.readAsDataURL(file); fileReader.onload = function(){ // 把读取到的base64 var imgBase64Data = this.result; fn(imgBase64Data); } }将base64转化为文件流
/** * 将base64转换为文件 * @param {baseURL} dataurl * @param {文件名称} filename * @return {文件二进制流}*/function dataURLtoFile(dataurl, filename) { var arr = dataurl.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 File([u8arr], filename, {type:mime}); }压缩方法
/*** canvas压缩图片* @param {参数obj} param * @param {文件二进制流} param.file 必传* @param {目标压缩大小} param.targetSize 不传初始赋值-1* @param {输出图片宽度} param.width 不传初始赋值-1,等比缩放不用传高度* @param {输出图片名称} param.fileName 不传初始赋值image* @param {压缩图片程度} param.quality 不传初始赋值0.92。值范围0~1* @param {回调函数} param.succ 必传*/function pressImg(param){ //如果没有回调函数就不执行 if(param && param.succ){ //如果file没定义返回null if(param.file == undefined) return param.succ(null); //给参数附初始值 param.targetSize = param.hasOwnProperty("targetSize") ? param.targetSize : -1; param.width = param.hasOwnProperty("width") ? param.width : -1; param.fileName = param.hasOwnProperty("fileName") ? param.fileName: "image"; param.quality = param.hasOwnProperty("quality") ? param.quality : 0.92; var _this = this; // 得到文件类型 var fileType = param.file.type; // console.log(fileType) //image/jpeg if(fileType.indexOf("image") == -1){ console.log('请选择图片文件^_^'); return param.succ(null); } //如果当前size比目标size小,直接输出 var size = param.file.size; if(param.targetSize > size){ return param.succ(param.file); } // 读取file文件,得到的结果为base64位 changeFileToBaseURL(param.file,function(base64){ if(base64){ var image = new Image(); image.src = base64; image.onload = function(){ // 获得长宽比例 var scale = this.width / this.height; // console.log(scale); //创建一个canvas var canvas = document.createElement('canvas'); //获取上下文 var context = canvas.getContext('2d'); //获取压缩后的图片宽度,如果width为-1,默认原图宽度 canvas.width = param.width == -1 ? this.width : param.width; //获取压缩后的图片高度,如果width为-1,默认原图高度 canvas.height = param.width == -1 ? this.height : parseInt(param.width / scale); //把图片绘制到canvas上面 context.drawImage(image, 0, 0, canvas.width, canvas.height); //压缩图片,获取到新的base64Url var newImageData = canvas.toDataURL(fileType,param.quality); //将base64转化成文件流 var resultFile = dataURLtoFile(newImageData,param.fileName); //判断如果targetSize有限制且压缩后的图片大小比目标大小大,就弹出错误 if(param.targetSize != -1 && param.targetSize < resultFile.size){ console.log("图片上传尺寸太大,请重新上传^_^"); param.succ(null); }else{ //返回文件流 param.succ(resultFile); } } } }); } }方法使用
文件的size是按照字节,所以我们需要把要求的大小转化成字节。 1字节就是1byte就是1B,1KB = 1024B,1MB = 1024 * 1024B
// 图片文件上传获取url$("#fileImg").on('change',function(){ pressImg({ file:this.files[0], targetSize:2 * 1024 * 1024, quality:0.5, width:600, succ:function(resultFile){ //如果不是null就是压缩成功 if(resultFile){ //TODO } } })});到此,相信大家对"如何使用canvas压缩图片大小"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
图片
文件
大小
函数
就是
二进制
字节
宽度
方法
目标
高度
输出
内容
原图
参数
名称
后台
时候
比例
画布
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技股互联网
科技互联网政务服务
互联网 科技
深圳科技互联网
科技与互联网发展
卓越科技(互联网 )
丰台科技园 互联网
沃里互联网科技
中正互联网科技招聘
山东吉时兔互联网科技有限公司
安控科技rtu产品工业互联网
欧洲十大科技互联网公司
崇明区互联网教育科技售后服务
本届互联网博览会上的黑科技
西安小鹰速贷互联网科技有限公司
工业互联网等科技实现智能化赋能
中和天地互联网科技有限公司
工业互联网山东科技大学
互联网科技手机排行榜
互联网企业和网络科技有限公司
北京互联网科技有限公司
互联网科技的未来发展
科技与互联网的利与弊
互联网大会黑科技排名
互联网公司科技股
黑科技闪耀互联网之光
未来五年的互联网科技
华夏恒生科技与互联网科技
锡山区互联网智能科技产品供应
科技信息时代互联网发展