如何使用canvas压缩图片大小
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,本篇内容主要讲解"如何使用canvas压缩图片大小",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用canvas压缩图片大小"吧!问题来源这个问题,源
千家信息网最后更新 2025年11月14日如何使用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安全错误
数据库的锁怎样保障安全
外网访问数据库的安全问题
黄浦区常规网络技术调试
昌平区进口软件开发推荐咨询
数据库加了索引查询
服务器远程监控软件
持续保障网络安全信息安全
网络安全事故级别
荣耀盒子连接服务器
适合当服务器的笔记本
江苏hpe服务器云主机
漳州四合软件开发有限公司
rdp基因数据库
软件开发需求审批表
科技软件开发app
php遍历数组存入数据库
纸坊租房软件开发
滴滴软件开发杭州陈超
云彩互联网科技是培训
数据库字符集可以改吗
网络安全周表彰
杭州硬件视频系统服务器
湖南计算机网络技术学院排名
洛奇服务器中断
保定市智联软件开发公司
上海携程软件开发研究生年薪
手机软件开发用什么开发工具
军人对于网络安全
软件开发服务费开票科目
饥荒为什么服务器延迟
蒙自市税务局网络安全