一种图片预览裁剪上传方法

前些时间想做一个兼容性比较好的图片上传功能,参考了很多网上的代码,首先否定了使用swf的方案,因为在手机端无法实现。因为要预览裁剪,也有很多采用先把原图上传服务器,再预览裁剪的方案,这样用户体验很不好,用户可能要等待很久。经过摸索,我写了一段代码实现了功能,先预览,再裁剪,最后上传,求指导。用到了图片裁剪插件Jcrop,HTML5文件对象。各位大神如果有更好的方案,可以兼容手机浏览器,请不吝赐教。

<!DOCTYPE html>
<html>
    <head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>图片上传</title>
	<meta content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" name="viewport" >
	<link  rel="stylesheet" type="text/css" href="__CSS__/jquery.Jcrop.min.css" />
	<link  rel="stylesheet" type="text/css" href="__CSS__/upload.css" />
	<script type="text/javascript" src="__JS__/jquery.js"></script>
	<script type="text/javascript" src="__JS__/jquery.Jcrop.min.js"></script>
	<script type="text/javascript" src="__JS__/layer/layer.js"></script>
    </head>

    <body>
    <input type="hidden" id='img_src'/>
    <div class="main">
    <form id="pic_form" class="update-pic cf" enctype="multipart/form-data" method="post" action="">
	<div class="upload-area">
	    <input type="file" id="user-pic" name="user-pic" />
	    <div class="file-tips">支持JPG,PNG,JPEG,图片小于1MB,尺寸不小于100*100!</div>
	    <div class="preview hidden" id="preview-hidden"></div>
	</div>
	<div class="preview-area">
	    <input type="hidden" id="x" name="x" />
	    <input type="hidden" id="y" name="y" />
	    <input type="hidden" id="w" name="w" />
	    <input type="hidden" id="h" name="h" />
	    <input type="button" class="uppic-btn save-pic" value="保存" />
	</div>
    </form>
		</div>

<script type="text/javascript">
    $(document).ready(function() {
	//选择图片
	$("#user-pic").change(function () {
	    //获取文件对象
    	    var	oFile = this.files[0];
	    var fileName = oFile.name;
	    var fileType = oFile.type;

	    // Android设备下读不到type信息,从文件名中解析
	    if(!fileType){
		fileType = "image/" + fileName.split(".").pop().toLowerCase();
	    }

	    //检查文件格式
	    var rFilter = /^(image\/jpeg|image\/png|image\/jpg)$/;
	    if (!rFilter.test(fileType)) {
		alert('请选择jpg、jpeg或png格式的图片');
		return;
	    }

	    //检查文件大小
	    if(oFile.size > 1024*1024){      
		alert('请选择小于1M的图片');
		return;
	    }
	    var preview = $('.upload-area').children('#preview-hidden');
	    preview.show().removeClass('hidden');

	    var img = $('<img id="cropbox" />');
	    preview.append(img);
	    var oImage = document.getElementById('cropbox');

	    var oReader = new FileReader();
	    oReader.readAsDataURL(oFile);

	    oReader.onload = function(e){
	    oImage.src = e.target.result;
	    //根据图片大小在画布里居中
	    oImage.onload = function(){
		var img_height = 0;
		var img_width = 0;
		var real_height = oImage.height;
		var real_width = oImage.width;
		if(real_height >= real_width && real_height > 300){
		    var persent = real_height / 300;
		    real_height = 300;
		    real_width = real_width / persent;
		}else if(real_width > real_height && real_width > 300){
		    var persent = real_width / 300;
		    real_width = 300;
		    real_height = real_height / persent;
		}
		if(real_height < 300){
		    img_height = (300 - real_height)/2;	
		}
		if(real_width < 300){
		    img_width = (300 - real_width)/2;
		}

		    var pic_w = (300-img_width)+'px';
		    var pic_h = (300-img_height)+'px';
		    var p_t = img_height+'px';
		    var p_l = img_width+'px'; 
		preview.children('img').css({width:pic_w,height:pic_h});
		preview.css({paddingTop:p_t,paddingLeft:p_l});
	    }
	}

		$('#cropbox').Jcrop({
			bgColor:'#333',   //选区背景色
			bgFade:true,      //选区背景渐显
			fadeTime:1000,    //背景渐显时间
			allowSelect:false, //是否可以选区,
			allowResize:true, //是否可以调整选区大小
			aspectRatio: 1,     //约束比例
			minSize : [100,100],//可选最小大小
			boxWidth : 300,		//画布宽度
			boxHeight : 300,	//画布高度
			setSelect:[ 100, 100, 200, 200],//初始化时位置
			onSelect: function (c){	//选择时动态赋值,该值是最终传给程序的参数!
				$('#x').val(c.x);//需裁剪的左上角X轴坐标
				$('#y').val(c.y);//需裁剪的左上角Y轴坐标
				$('#w').val(c.w);//需裁剪的宽度
				$('#h').val(c.h);//需裁剪的高度
		    }
		});
	});					

	$('.save-pic').click(function(){
		if($('#preview-hidden').html() == ''){
			alert('请先上传图片!');
		}else{
			var formData = new FormData($("#pic_form")[0]);
			$.ajax({
				url : '__URL__/uploadImg',//文件提交后台
				type : 'post',
				data : formData,
				contentType : false,//必须false才会自动加上正确的Content-Type  
				processData : false,//必须false才会避开jQ对formdata的默认处理,XMLHttpRequest会进行正确的处理 
				success:function(ret){
					if (ret.status==1){
						//给隐藏字段赋值
						$("#img_src").val(ret.data);
						
						//其它操作

					}else{
						alert('error');
					}
				}

			});  
		}
	});
});

</script>

</body>
</html>


你可能感兴趣的:(jcrop,图片上传,图片裁剪)