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!"); } } }); });