file API,直接读取本地文件。fileAPI和JCrop的结合使用上传头像。
1、html部分
<input id="demo" type="file" name="file" onchange="showPic();"/>
<img id="avatar" src="" style="width:200px">
2、fileAPI预览图片
<script type="text/javascript">
function showPic(){
var file = $(‘#demo‘)[0].files[0];
var reader = new FileReader();
reader.onload = function(){//加载成功后会触发。reader.onloadend加载成功或失败都会触发
$(‘#avatar‘).attr(‘src‘,reader.result);
}
reader.readAsDataURL(file);
}
</script>
3、JCrop截取图片工具
<link rel="stylesheet" href="./JCrop/css/jquery.Jcrop.css" />
<script src="./jquery-1.8.3.min.js" type="text/javascript"></script>
//项目本身1.11有点问题,项目版本不支持,在下面再引用一遍1.8.2把之前版本覆盖,我试着是可以
<script type="text/javascript" src="./JCrop/js/jquery.JCrop.min.js"></script>
<script type="text/javascript">
var Jcrop_api;
function showPic(){
var file = $(‘#demo‘)[0].files[0];
var reader = new FileReader();
reader.onloadend = function(){
$(‘#avatar‘).attr(‘src‘,reader.result);
}
reader.readAsDataURL(file);
var Jcrop_api = $.Jcrop($("#avatar"),{//初始化JCrop
aspectRatio : 1 , //设置截图为正方形
onChange: showCoords,//
onSelect: showCoords
});
}
function showCoords(coords){//预览裁剪效果,没详细写
console.log(coords);//截图信息
}
</script>
4、将图片和截取数据传往后台处理
Jcrop的getScaleFactor()方法可以获取图片缩放比例[w,h]。但是我获取的一直是1:1,干脆不用了。
往后台传数据用到两个东西,一个是formData,一个是xmlHttpRequest.
var formData = new FormData;
formData.append(‘file‘,$(‘#demo‘)[0].files[0]);
formData.append(‘x‘,Jcrop_api.tellScaled().x);
formData.append(‘y‘,Jcrop_api.tellScaled().y);
formData.append(‘w‘,Jcrop_api.tellScaled().w);
formData.append(‘h‘,Jcrop_api.tellScaled().h);//以上xywh四个值用来剪裁小图用的
formData.append(‘showHeight‘,$(‘#avatar‘).style.height);//图片在页面的显示高度传到后台,用来计算图片的缩放比例
xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST",url,true);
xmlhttp.send();//就是一个ajax
5、后台处理
后台spring接收,用BufferedImage进行剪裁
public void setAvatar(MultipartFile file,Integer x,Integer y,Integer w,Integer h,Integer showHeight){
try {
String suffix = file.getOriginalFilename().split(".")[file.getOriginalFilename().split(".").length-1];
String avatarPath = "D:\\file\\"+UUID.randomUUID().toString().replaceAll("_","")+"."+suffix;
BufferedImage bi = ImageIO.read(file.getInputStream());
BigDecimal realHeight = new BigDecimal(bi.getHeight()+"");
BigDecimal ratio = realHeight.divide(new BigDecimal(showHeight+""));
x = ratio.multiply(new BigDecimal(x)).intValue();
y = ratio.multiply(new BigDecimal(y)).intValue();
w = ratio.multiply(new BigDecimal(w)).intValue();
h = ratio.multiply(new BigDecimal(h)).intValue();
BufferedImage newBi = bi.getSubimage(x, y, w, h);
ImageIO.write(newBi, suffix, new File(avatarPath));
/*
*将可访问的头像文件路径赋值给用户实体
*/
return "success";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
6、遇到的问题
页面在JS动态改变img的src属性后,img的宽度有时不能自适应(有时可以,有时不可以)。导致图片被拉伸变形,剪裁结果不准确。
7、附Jcrop API
参数:
名称 |
默认值 |
说明 |
allowSelect |
true |
允许新选框 |
allowMove |
true |
允许选框移动 |
allowResize |
true |
允许选框缩放 |
trackDocument |
true |
|
baseClass |
“jcrop” |
基础样式名前缀。说明:class=”jcrop-holder”,更改的只是其中的 jcrop。 |
addClass |
null |
添加样式。例:假设值为 “test”,那么会添加样式到 |
bgColor |
“black” |
背景颜色。颜色关键字、HEX、RGB 均可。 |
bgOpacity |
0.6 |
背景透明度 |
bgFade |
false |
使用背景过渡效果 |
borderOpacity |
0.4 |
选框边框透明度 |
handleOpacity |
0.5 |
缩放按钮透明度 |
handleSize |
9 |
缩放按钮大小 |
handleOffset |
5 |
缩放按钮与边框的距离 |
aspectRatio |
0 |
选框宽高比。说明:width/height |
keySupport |
true |
支持键盘控制。按键列表:上下左右(移动)、Esc(取消)、Tab(跳出裁剪框,到下一个) |
cornerHandles |
true |
允许边角缩放 |
sideHandles |
true |
允许四边缩放 |
drawBorders |
true |
绘制边框 |
dragEdges |
true |
允许拖动边框 |
fixedSupport |
true |
|
touchSupport |
null |
|
boxWidth |
0 |
画布宽度 |
boxHeight |
0 |
画布高度 |
boundary |
2 |
边界。说明:可以从边界开始拖动鼠标选择裁剪区域 |
fadeTime |
400 |
过度效果的时间 |
animationDelay |
20 |
动画延迟 |
swingSpeed |
3 |
过渡速度 |
minSelect |
[0,0] |
选框最小选择尺寸。说明:若选框小于该尺寸,则自动取消选择 |
maxSize |
[0,0] |
选框最大尺寸 |
minSize |
[0,0] |
选框最小尺寸 |
onChange |
function(){} |
选框改变时的事件 |
onSelect |
function(){} |
选框选定时的事件 |
onRelease |
function(){} |
取消选框时的事件 |
方法:
名称 |
说明 |
setImage(string) |
设定(或改变)图像。例:jcrop_api.setImage("newpic.jpg") |
setOptions(object) |
设定(或改变)参数,格式与初始化设置参数一样 |
setSelect(array) |
创建选框,参数格式为:[x,y,x2,y2] |
animateTo(array) |
用动画效果创建选框,参数格式为:[x,y,x2,y2] |
release() |
取消选框 |
disable() |
禁用 Jcrop。说明:已有选框不会被清除。 |
enable() |
启用 Jcrop |
destroy() |
移除 Jcrop |
tellSelect() |
获取选框的值(实际尺寸)。例子:console.log(jcrop_api.tellSelect()) |
tellScaled() |
获取选框的值(界面尺寸)。例子:console.log(jcrop_api.tellScaled()) |
getBounds() |
获取图片实际尺寸,格式为:[w,h] |
getWidgetSize() |
获取图片显示尺寸,格式为:[w,h] |
getScaleFactor() |
获取图片缩放的比例,格式为:[w,h]。 网上有些版本的jquery.JCrop.min.js文件中不包含这个方法,重新下载一个完成版 |