原生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;
时间: 2024-08-02 20:34:56

原生js 对图片的压缩上传的相关文章

HTML5 图片本地压缩上传插件

======================前端代码========================= <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>localResizeIMG</title> <!--引入JQuery 用于异步上传图片--> <script type="text/javascript"

CANVAS运用-对图片的压缩上传(仅针对移动浏览器)

最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等)上传时间过长会导致上传失败,而每次都上传原始大小的图片(后台处理压缩)十分影响用户体验,所以研究了一下通过canvas压缩图片并上传的方法,以下是整理的一些思路和心得: 一.<input type="file">获取本地图片,并将图片绘制到画布中.此处的难点在于:由于浏览器的

Html5+asp.net mvc 图片压缩上传

在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩. 废话不多少不多说直接看代码: 本次测试使用了 zepto.min.js 插件,更新版本的下载请点击这里 主要js代码: //图片压缩处理 ; (function () { /** * 加载的时候进行抽样检测 * 在iOS中,大于2M的图片会抽样渲染 */ func

PHP仿微信多图片预览上传功能

PHP仿微信多图片预览下载演示地址:http://www.erdangjiade.com/js...生产图片区域,上传按钮#btn可替换自己想要的图片 [html] view plain copy在CODE上查看代码片派生到我的代码片 <ul id="ul_pics" class="ul_pics clearfix"> <li><img src="logo.png" id="btn" class=

纯原生js移动端图片压缩上传插件

前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于jquery.zepto的(这句话似乎吐槽次数太多了...),然后我也就不吐槽了, 然后当然是自己做了,先上图: 纯原生js的移动端图片压缩上传插件,不依赖任何库 用法 在html页面中引入input标签,通过自定义属性data-LUploader绑定点击触发的标签id,写法如下: <div cla

前端图片压缩上传(纯js的质量压缩,非大小压缩)

此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个是文件(

前端图片压缩上传(纯js的质量压缩,非长宽压缩)

原文: 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个

H5+jqweui实现手机端图片压缩上传

主要功能,使用H5的formData上传base64格式的图片,canvas压缩图片,前端样式使用weui,为方便起见,使用了jquery封装过的weui,jqweui. 话不多少,开始上代码. 前端代码,直接在jqweui官网下的demo里改的(是dist下的demo) <!DOCTYPE html> <html> <head> <title>jQuery WeUI</title> <meta charset="utf-8&qu

移动前端—图片压缩上传实践

目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的 实现.根据查看caniuse,本demo里使用到的FileReader.Blob.Formdata对象均已在大部分移动设备浏览器中得到了实现 (safari6.0+.android 3.0+),所以直接在前端压缩图片,已经成了很多移动端图片上传的必备功能了. 在移动端压缩图片并且上传主要用到filereader.canvas 以及 formdata 这三个h5的api.逻辑并不难.整个过程就是: (1)用户使用input