原生js 对图片的压缩上传
小石头原创,转载请注明出处,谢谢~!
var jsoncode=(function(){ /* imgzip:图片压缩, * json: * file :必须。file类型的input按钮的选择器(#id,.class,input[type=file]...) * fileStyle:可选。是否设置按钮的样式。默认为false * widt :可选。被压缩后的图片宽度 * quality :可选。被压缩后的图片质量 * type :可选。图片格式(仅支持png-无压缩,jpeg/jpg,可压缩) * error :可选。错误信息 * success :可选。成功信息,包图片流等。返回值是一个对象 * imgzip({ file :‘#fileid‘, fileStyle:true, width :‘100‘|100|‘50%‘, quality :‘0.3‘|0.3, error :function(error){ console.log(error); }, success :function(data){ console.log(data); } }); 返回值: Object{ name: "32", 原始图片的名称,不包含后缀 nameSuffix: ".jpg", 原始图片的后缀名 type: "image/jpeg", 原始图片类型 size: 183844, 原始图片大小 width: 590 原始图片宽度 height: 470, 原始图片高度 url: "data:image/jpeg;base64,...", 原始图片路径 flow: "", 原始图片流 img: imgDom, 原始图片(保存在img中) quality: 0.1, 图片压缩质量 newType: "image/jpeg", 压缩后图片格式 newWidth: 590, 压缩后图片高度 newHeight: 470, 压缩后图片高度 newUrl: "data:image/jpeg;base64,...", 压缩后图片路径 newFlow: "", 压缩后图片流 canvas: canvasDom, 压缩后图片(保存在canvas中) localTimeStamp: 1413531845, 本地时间戳 } */ this.imgzip=function(obj){ //获取file按钮 if (obj.file) { imgzip.file=obj.file; }else{ return console.log(‘selector is null‘); } //获取文件按钮对象 var input=document.querySelector(imgzip.file); //给文件按钮添加accept属性值:image/*(表示只能选择图片类型的文件) input.setAttribute(‘accept‘,‘image/*‘); var file=null; //是否重置input样式 imgzip.fileStyle=obj.fileStyle||false; if (!imgzip.fileStyle) { file=input; }else{ //克隆input file=input.cloneNode(true); //创建父盒子模型 var label=document.createElement(‘label‘); //获取属性placeholder的值,作为按钮名称 var text=file.getAttribute(‘placeholder‘)||‘选择图片‘; //创建文本节点 textNode=document.createTextNode(text); //将克隆的input添加到盒子中 label.appendChild(file); label.appendChild(textNode); //将原来的input替换为带有盒子div的input input.parentNode.replaceChild(label,input); //设置盒子class label.setAttribute(‘class‘,‘fileInput‘); //定义盒子样式 var style=document.createElement(‘style‘); style.setAttribute(‘type‘,‘text/css‘); document.querySelector(‘head‘).appendChild(style); style.innerHTML=‘.fileInput{color:#fff;text-align:center;line-height:32px;font-size:14px;border-radius:2px;cursor:pointer;display:inline-block;width:100px;height:32px;background-color:rgb(56,121,217);}‘; style.innerHTML+=‘.fileInput input[type=file]{width:100%;display:none;}‘; } //接收错误信息 imgzip.error=obj.error||function(){}; //返回图片信息 imgzip.success=obj.success||function(){}; //获取用户图片格式 if (/png/.test(obj.type)) { imgzip.type=‘image/png‘; }else{ imgzip.type=‘image/jpeg‘; } //获取用户要设置的图片宽度 imgzip.width=obj.width||null; //获取图片压缩比例 if (parseFloat(obj.quality)) { imgzip.quality=parseFloat(obj.quality); }else{ imgzip.quality=0.9; } console.log(imgzip.quality); //判断选择器是否正确 if (file==null) { imgzip.error(fileSelector+‘ is null‘); return false; }else if(file.type!=‘file‘){ imgzip.error(fileSelector+‘ is not file‘); return false; }else{ file.addEventListener(‘change‘,this.read,false); } } //读取文件流 this.read=function(event){ //读取到的文件 var file=this.files[0]; //当取消选择的图片时处理错误 if (file===undefined)return false; //返回的文件对象 var fileobj={}; //获取图片类型 fileobj.type=file.type; //获取图片名称 fileobj.name=file.name.substring(0,file.name.lastIndexOf(‘.‘)); //后缀名 fileobj.nameSuffix=file.name.substring(file.name.lastIndexOf(‘.‘),file.name.length); //获取图片大小 fileobj.size=file.size; //图片新格式 fileobj.newType=imgzip.type; //获取图片压缩质量 fileobj.quality=imgzip.quality; //创建图片流对象 var reader = new FileReader(); reader.readAsDataURL(file); reader.onerror=function(){ console.log(reader.error) } //图片加载完成时获取信息 reader.onload=function(e){ //时间戳 var strTimeStamp=‘‘+e.timeStamp; strTimeStamp=strTimeStamp.substring(0,strTimeStamp.length-3); fileobj.localTimeStamp=parseInt(strTimeStamp); //获取base64文件流 fileobj.url=reader.result; //获取纯图片二进制流 fileobj.flow=reader.result.replace(‘data:‘+fileobj.type+‘;base64,‘,‘‘); //创建img对象 var img=new Image(); //获取img内容 img.src=fileobj.url; fileobj.img=img; //获取图像大小 fileobj.width=img.width; fileobj.height=img.height; //图片宽高比例 宽/高 var scale=img.width/img.height; //图像新大小 if (imgzip.width==null) { fileobj.newWidth=img.width; fileobj.newHeight=img.height; }else if (/%$/.test(imgzip.width)){ var percent=parseInt(imgzip.width.replace(/%$/,‘‘)); fileobj.newWidth=(img.width*percent)/100; fileobj.newHeight=(img.width*percent)/(scale*100); }else{ fileobj.newWidth=imgzip.width; fileobj.newHeight=imgzip.width/scale; } //创建画布 var canvas=document.createElement(‘canvas‘); //确定画布的宽高 canvas.width=fileobj.newWidth; canvas.height=fileobj.newHeight; //创建二维空间 var cxt=canvas.getContext(‘2d‘); //将图像画到画布上 cxt.drawImage(img, 0, 0, fileobj.newWidth, fileobj.newHeight); fileobj.canvas=canvas; //获取新图像的路径 fileobj.newUrl=canvas.toDataURL(fileobj.newType, fileobj.quality); //获取新的图片流媒体 fileobj.newFlow=fileobj.newUrl.replace(‘data:‘+fileobj.newType+‘;base64,‘,‘‘); //返回fileobj对象 return imgzip.success(fileobj); } }
return this;
})(jsoncode); window.jsoncode=jsoncode;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。