如何使用canvas压缩图片大小
发表于:2024-10-18 作者:千家信息网编辑
千家信息网最后更新 2024年10月18日,本篇内容主要讲解"如何使用canvas压缩图片大小",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用canvas压缩图片大小"吧!问题来源这个问题,源
千家信息网最后更新 2024年10月18日如何使用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安全错误
数据库的锁怎样保障安全
如何给普通人讲清楚网络安全防护
数据库事务故障含义
畅宇科技互联网
物流软件开发设计
网络安全现状的简要
软件开发项目合同预付款比例
服务器安全措施模板
华为手机激活时显示网络服务器忙
diy服务器推荐
网站的数据库都有什么
电商平台数据库
电脑安装数据库时提示错误
数据库显示语句已终止怎么回事
视频捕捉软件开发
中国公安大网络安全保卫学院
已断开 服务器无响应
alter删除数据库文件
数据库单元三创建和管理数据
网络安全 3.0
网络安全新形势新技术
我的世界服务器为什么会吞方块
免费自助建设软件开发商
石嘴山软件开发定制贵吗
阿里的数据库
如何使用网络安全软件
期货网络安全事件分级
黑客与网络安全txt
滑坡检测系统集成软件开发
饥荒自建服务器怎么设置管理员
中科大网络安全录取名单