项目需要做一个头像截取的功能,类似于QQ头像截取功能。在网上搜了下,最后使用jQuery插件jcrop来截取,

在后台来进行图片切割。

头像截取的原理:在前台使用jcrop获取切面的x轴坐标、y轴坐标、切面高度、切面宽度,然后将这四个值传给后

台。在后台要进行放大处理:将切面放大N倍,N=原图/前台展示的头像。即X = X*原图宽/前图宽,Y = Y*原图高/前

图高,W = W*原图宽/前图宽,H = H*原图高/前图高。

实例:

JSP:

     <div id="cutImage" style="display: none;">
<div class="bigImg" style="float: left;">
<img id="srcImg" src="" width="400px" height="270px"/>
</div>
<div id="preview_box" class="previewImg">
<img id="previewImg" src="" width="120px"/>
</div>
<div >
<form action="" method="post" id="crop_form">
<input type="hidden" id="bigImage" name="bigImage"/>
<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" />
<P><input type="button" value="确认" id="crop_submit"/></P>
</form>
</div>
</div>

样式:大图、小图展示都需要固定高度、宽度,因为后台需要进行放大处理。即:<img width=""height=""/>

然后是使用jcrop了。在使用jcrop前我们需要下载jcrop:http://deepliquid.com/content/Jcrop.html。

将下载的压缩包解压后可以看到三个文件夹及一个index.html文件,/ css下放置的是Jcorp的样式文件,/demo下放置的是几个简单的例子(index.html中引用的链接就是放置在这个文件夹下),/js下放置的是Jcorp中最重要的脚本文件。我们只需要使用三个文件即可:jquery.Jcrop.css、jquery.Jcrop.js、JQuery.js

使用方法:

//裁剪图像
function cutImage(){
$("#srcImg").Jcrop( {
aspectRatio : 1,
onChange : showCoords,
onSelect : showCoords,
minSize :[200,200]
});
//简单的事件处理程序,响应自onChange,onSelect事件,按照上面的Jcrop调用
function showCoords(obj) {
$("#x").val(obj.x);
$("#y").val(obj.y);
$("#w").val(obj.w);
$("#h").val(obj.h);
if (parseInt(obj.w) > 0) {
//计算预览区域图片缩放的比例,通过计算显示区域的宽度(与高度)与剪裁的宽度(与高度)之比得到
var rx = $("#preview_box").width() / obj.w;
var ry = $("#preview_box").height() / obj.h;
//通过比例值控制图片的样式与显示
$("#previewImg").css( {
width : Math.round(rx * $("#srcImg").width()) + "px", //预览图片宽度为计算比例值与原图片宽度的乘积
height : Math.round(rx * $("#srcImg").height()) + "px", //预览图片高度为计算比例值与原图片高度的乘积
marginLeft : "-" + Math.round(rx * obj.x) + "px",
marginTop : "-" + Math.round(ry * obj.y) + "px"
});
}
}
}

在使用jcrop前一定要先将$(“”).jcrop();进行预初始化,否则没有效果。

还有一种调用的方法,

 var api = $.Jcrop('#cropbox',{
onChange: showPreview,
onSelect: showPreview,
aspectRatio: 1
});

这种方法是将Jcrop生成的对象赋给一个全局变量,这样操作就会比较方便。

通过上面的js,就将X轴坐标、Y轴坐标、高度H、宽度W这个四个值传递给后台了,后台就只需要根据这四个值

进行放大处理,然后切割即可。

Action

 /**
* 裁剪头像
*/
public String cutImage(){
/*
* 获取参数
* x,y,w,h,bigImage
*/
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
int x = Integer.valueOf(request.getParameter("x"));
int y = Integer.valueOf(request.getParameter("y"));
int w = Integer.valueOf(request.getParameter("w"));
int h = Integer.valueOf(request.getParameter("h"));
String bigImage = request.getParameter("bigImage");
//获取文件真实路径
//获取文件名
String[] imageNameS = bigImage.split("/");
String imageName = imageNameS[imageNameS.length-1];
//文件正式路径
String imagePath = getSavePath()+"\\"+imageName;
//切割图片
ImageCut imageCut = new ImageCut();
imageCut.cutImage(imagePath, x, y, w, h);
//头像裁剪完成后,将图片路径保存到用户
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
userBean.setUserPhoto(bigImage);
//保存头像
UserCenterService centerService = new UserCenterService();
centerService.updatePhoto(userBean);
//将修改后的用户保存到session中
request.getSession().setAttribute("userBean", userBean);
return "updatePhoto";
}
}

裁剪图片工具类:ImageCut.java

public class ImageCut {
/**
* 图片切割
* @param imagePath  原图地址
* @param x  目标切片坐标 X轴起点
* @param y  目标切片坐标 Y轴起点
* @param w  目标切片 宽度
* @param h  目标切片 高度
*/
public void cutImage(String imagePath, int x ,int y ,int w,int h){
try {
Image img;
ImageFilter cropFilter;
// 读取源图像
BufferedImage bi = ImageIO.read(new File(imagePath));
int srcWidth = bi.getWidth();      // 源图宽度
int srcHeight = bi.getHeight();    // 源图高度
//若原图大小大于切片大小,则进行切割
if (srcWidth >= w && srcHeight >= h) {
Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);
int x1 = x*srcWidth/400;
int y1 = y*srcHeight/270;
int w1 = w*srcWidth/400;
int h1 = h*srcHeight/270;
cropFilter = new CropImageFilter(x1, y1, w1, h1);
img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
BufferedImage tag = new BufferedImage(w1, h1,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(img, 0, 0, null); // 绘制缩小后的图
g.dispose();
// 输出为文件
ImageIO.write(tag, "JPEG", new File(imagePath));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

效果图:

点击确认后,就会在指定路径下生成相应的图片:

OVER!!

使用jcrop进行头像剪切相关推荐

  1. php jcrop教程,PHP+Jcrop+artDialog头像上传

    上节课我们讲解了artDialog强大的弹出层插件,本文以实例讲解个人中心常用的头像裁剪. 下载资源 下载积分: 120 积分 HTML PHP+Jcrop+artDialog头像上传 引入jQuer ...

  2. 混合App应用实现本地头像剪切,压缩上传功能(支持任何H5框架)

    头像上传是任何一个应用都会用到的功能,但是头像的尺寸往往需要控制一下,这样会有一个比较不错的显示效果,例如我们通常会控制用户的头像为正方形,这个切圆角边的时候不会变形,显示位置也很固定. 对于H5混合 ...

  3. Java 头像剪切及上传服务器JSP 笔记

    头像存储真是个令人头疼的问题啊 效果: 视频没办法发,好不容易上传到B站结果这里告诉我格式错误 主要用到Java的JFrame文件选择器,然后用拦截方法过滤掉不是图片类型的文件. 用JFrame得到文 ...

  4. springMVC+jcrop实现头像上传截图功能

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. jcrop php 头像裁剪,上传裁剪头像(Jcrop)

    上传裁剪头像(Jcrop) -- by Stephen 2016/1/24 20:17:21 总体思路:用户点击选择头像按钮,选好图片后jcrop所在的div以遮罩层的形式显示,此时异步更新图片的sr ...

  6. vue -- 移动端(vant)更换头像剪切功能

    效果: 思路: 利用 file input 特性,获取到选中的图片. 借助 vue-cropper 实现头像剪裁功能,然后把剪裁的头像上传至服务器,完成更换头像操作 代码: myDetails.vue ...

  7. ucenter头像剪切

    2019独角兽企业重金招聘Python工程师标准>>> <?php class AvatarUploader {     // 本次页面请求的 url     private ...

  8. Jcrop论坛头像截取上传

    附件中是我的一个小例子 转载于:https://blog.51cto.com/3131854/1303577

  9. 使用 jQuery Jcrop 实现图像裁剪

    一.使用方法: 代码: // 载入CSS文件 <link rel="stylesheet" href="css/jquery.Jcrop.css"> ...

最新文章

  1. Windows中配置java变量环境
  2. 用Auto-TensorCore代码生成优化matmul
  3. android 定义date对象,如何从Date对象设置Android Chronometer基准时间?
  4. 用C#使用HttpWebRequest Post数据时如何保持Session
  5. 产品设计 | App功能设计的21条注意事项
  6. Ubuntu 16.04 开机自动锁定数字键盘
  7. Mysql ORDER BY用法的一点理解
  8. 1000套安卓(Android)毕业设计(带论文)、大作业、实例快速下载 (Android Studio)
  9. Redis入门指南-2
  10. 小鸡模拟器android,安卓小鸡模拟器运行总结~
  11. 使用openssl实现AES CBC 128 pcks7加密
  12. android的listview分组显示的时候layout_marginTop失效的解决办法
  13. UE4第三人称多人联机游戏开发02
  14. 腾讯计算机安全实验室,TRP-AI反病毒引擎创新:腾讯安全最新成果入围顶级学术会议...
  15. 身份证复印件的正确写法
  16. 【计算机网络系列】链路层的差错控制与流量控制
  17. postman + node-red 发送e-mail(附件、抄送、密送)
  18. stm32cubeide驱动LCD1602显示屏
  19. oci连接mysql_PLSQL Developer配置OCI连接远程数据库
  20. ae中心点重置工具_AE中心点锚点移动对齐脚本 Move Anchor Point V2.0

热门文章

  1. iOS开发 - 正则表达式 RegexKitLite框架
  2. 最详尽版本:一文带你了解beam search算法
  3. Spring框架的IOC原理
  4. 不用电脑怎么恢复微信删除的聊天记录的方法
  5. mybatis动态查询列
  6. 蝉花与冬虫夏草的比较
  7. 在CDH 6.3.1上安装HAWQ 2.4.0
  8. Android 入门之 安装镜像 (鉴于国内Google相关很多服务都无法访问)
  9. 运行自定义映像。linux,安装和使用virt-customize自定义Qcow2/Raw Linux OS磁盘映像
  10. 无主之地kill ajax,【图片】无主之地2 Mod制作基础知识(一)【borderlands技术理论吧】_百度贴吧...