使用JCrop裁剪图片

JCrop是一个基本JQuery的图像裁剪插件,其主页在此 。关于JCrop的使用主页上中丰富的例子,这里要实际图片上传及裁剪的功能。

 

第一步,实现图片上传,上传完成时页面不能刷新。通常不刷新页面会使用AJAX技术,但是AJAX不能发送multipart/form-data格式的数据,这时就只能使用iframe了,可以参见这篇文章

 

<div id="avator-croper">
    <div>
		<!-- upload form -->
        <form id="upload-form" target="upload_target" method="post" action="/uploadAvator">
            <input type="file" name="file" /> <input type="submit" id='upload-avator' value="Upload" />
        </form>
        <iframe id="upload_target" name="upload_target" src="" style="display:none"></iframe>
    </div>

    <div id="crop-area" style="display: none">
        <div>
            <img id="cropbox" src="" />		<!-- original image -->
        </div>
        <div style="width: 150px; height: 150px; overflow: hidden; margin-left: 5px; margin-top: 10px">
            <img id="preview" src="">		<!-- preview image -->
        </div>
    </div>
    
    <div>
        <form action="/cropAvator" method="post">
            <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" />
            <button type="submit" id="submit-avatar">Crop Image</button>
        </form>
    </div>
</div>
 

上面的HTML分为三部分,第一部分定义了图片上传的form和一个隐藏的iframe,form的target定义成iframe的id。第二部分是图片的裁剪及预览区域。第三部分是定义裁剪区域参数,包括裁剪区域左上角位置、裁剪区域宽度和高度,确认裁剪时这些参数需要传递到服务器端。下面是处理图片上传的JavaScript代码,它处理了iframe的onload事件。

 

$('#upload-form').submit(function(e) {
	$('#upload_target').one('load', function() {
		var ret = $('body', frames['upload_target'].document).html();
		var data = eval("(" + ret + ")");
		if (data.Status == 'OK') {
			var imageUrl = data.ImageUrl;
			// ...
		} else {
			alert("Upload Failed!");
		}
	});
});
 

其中省略的代码是交由JCrop处理的部分,其主要内容是设置待裁剪和预览图片的src属性,并调用JCrop方法。

 

		if (data.Status == 'OK') {
			var imageUrl = data.ImageUrl;
			$('#cropbox').attr('src', imageUrl);
			$('#preview').attr('src', imageUrl);
			$("#cropbox").Jcrop({
				onChange: showPreview,
				onSelect: showPreview,
				aspectRatio: 1
			});
			$('#crop-area').show();
		}
 

 

showPreview函数如下:

 

    function showPreview(coords) {
        var rx = 150 / coords.w;
        var ry = 150 / coords.h;

        $('#preview').css({
            width: Math.round(rx * 500) + 'px',
            height: Math.round(ry * 370) + 'px',
            marginLeft: '-' + Math.round(rx * coords.x) + 'px',
            marginTop: '-' + Math.round(ry * coords.y) + 'px'
        });
        $('#x').val(coords.x);
        $('#y').val(coords.y);
        $('#w').val(coords.w);
        $('#h').val(coords.h);
    };
 

用户选择裁剪区域并点击确定按钮后,选择区域参数传给服务器,并返回裁剪后的图片URL,并更新avator,也使用AJAX完成。

 

$('#submit-avatar').click(function(e) {
	e.preventDefault();
	var form = $(this).closest('form');
	$.ajax({
		type: 'POST',
		url: form.attr('action'),
		dataType: 'json',
		data: form.serialize(),
		success: function(data) {
			if (data.Status == 'OK') {
				$('#avatar-image').attr('src', data.ImageUrl);
			} else {
				alert("Server Error!");
			}
		}
	});
});
 

 

 

 

你可能感兴趣的:(JavaScript,jquery,Ajax,json,qq)