欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用cropper.js裁剪头像的实例代码

程序员文章站 2022-09-02 16:29:15
最近项目需要头像裁剪的功能,在网上找了一下,发现了github上的cropper项目还不错,借鉴了一下。。用起来挺简单的,下面是我做的一个小例子: 开始先放个成品图:...

最近项目需要头像裁剪的功能,在网上找了一下,发现了github上的cropper项目还不错,借鉴了一下。。用起来挺简单的,下面是我做的一个小例子:

开始先放个成品图:

使用cropper.js裁剪头像的实例代码

下面给出前后端的代码

前端页面是一个单独的jsp页面,用来做弹出层来裁剪图片比较好。

关于jsp页面引用的两个关于cropper的 文件,我就不提供了。大家需要的可以去官方的github上去下载。

地址:

<%@ page language="java" contenttype="text/html; charset=utf-8"
 pageencoding="utf-8"%>
<%@ include file="../common_front.jsp" %> 
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>insert title here</title>
<link rel="stylesheet" href="${path }/front/plugins/cropper/cropper.css" rel="external nofollow" >
<script src="${path }/front/plugins/cropper/cropper.js"></script>
 <style>
 .container {
  max-width: 640px;
  margin: 20px auto;
 }
 img {
  max-width: 100%;
 }
 #result img{
  max-width: 200px;
  max-height: 200px;
 }
 .cropper-view-box,
 .cropper-face {
  border-radius: 50%;
 }
 </style>
 <script type="text/javascript">
 function getsize(size){
  var num=parseint(size);
  if(num<=300){//先要求图片的大小小于300之间
  return num;
  }
  return getsize(num/2);
 }
 function getroundedcanvas(sourcecanvas) {
  var canvas = document.createelement('canvas');
  var context = canvas.getcontext('2d');
  var width = sourcecanvas.width;
  var height = sourcecanvas.height;
  width=getsize(width);
  height=width;
  canvas.width = width;
  canvas.height = height;
  context.beginpath();
  //这里是控制裁剪区域的大小(这里也决定你所要生成的图片的大小和形状 我这边用的是圆形的头像 大家有别的需要可以修改)
  context.arc(width/2, height/2, math.min(width, height)/2, 0, 2 * math.pi);
  context.strokestyle = 'rgba(0,0,0,0)';
  context.stroke();
  context.clip();
  context.drawimage(sourcecanvas, 0, 0, width, height);
  return canvas;
 }
 $(function(){
  var $image = $('#image');
  var $button = $('#button');
  var $result = $('#result');
  var croppable = false;
  $image.cropper({
   aspectratio: 1,
   viewmode: 1,
   ready: function () {
    croppable = true;
   }
  });
  $button.on('click', function () {
   var croppedcanvas;
   var roundedcanvas;
   if (!croppable) {
    return;
   }
   // 裁剪
  croppedcanvas = $image.cropper('getcroppedcanvas');
  //判断图片大小,如果超过1080 则返回
   if(croppedcanvas.width>1080){
   alert("图片过大,请重新选择!");
   return false;
   }
   // 生成圆形
  roundedcanvas = getroundedcanvas(croppedcanvas);
   //将裁剪区域的图片转出图片的base64编码,放到表单里提交到后台。后台再对其进行解码,保存。
   $("#icon").val(roundedcanvas.todataurl());
   $.ajax({
   url:'${path }/front/saveusericon',
   data:$("#submitform").serialize(),
   type:'post',
   success:function(data){
   if(data.code==200){
    parent.location.reload(); // 父页面刷新
      var index = parent.layer.getframeindex(window.name); //获取窗口索引
      parent.layer.close(index);
   }else{
   warningalert(data.msg);
   }
   }
   });
   return false;
 });
 //当选择完图片后,直接提交表单到后台,图片保存后再回到此页面。这样此页面的图片裁剪画布就改变成你所选择的图片了
  $("#file").change(function(){
   var filename=$("#file").val();
   filename=filename.tolowercase(); 
   if((filename.indexof(".jpg")!=-1)||(filename.indexof(".png")!=-1)||(filename.indexof(".jpeg")!=-1)||(filename.indexof(".bmp")!=-1)||(filename.indexof(".gif")!=-1)){
   $("#imageuploadform").submit();   
   }else{
   alert("所选图片格式错误或者不支持此类图片格式!");
   }   
   return false;
  });
 });
</script> 
</head>
<body>
 <div class="container">
 <form enctype="multipart/form-data" method="post" id="imageuploadform" action="${path}/front/imageupload" >
 <span class="btn-upload">
  <a href="javascript:void();" rel="external nofollow" class="btn btn-primary radius"><i class="iconfont">????</i> 选择图片</a>
  <input type="file" name="file" id="file" class="input-file">
  <input type="hidden" name="originalimage" value="${imagerelativepath}"/>  
 </span>
 </form>
 <div>
 <c:if test="${!empty imagerelativepath }">
  <img id="image" src="${path }/${imagerelativepath}" alt="picture">
 </c:if>
 <c:if test="${!empty userico }">
  <img id="image" src="${path }/${userico}" alt="picture">
 </c:if>
 <c:if test="${!empty teachericon }">
  <img id="image" src="${path }/${teachericon}" alt="picture">
 </c:if>
 </div> 
 <form id="submitform" action="" method="post">  
  <input type="hidden" name="originalimage" value="${imagerelativepath}"/>
  <input type="hidden" name="icon" id="icon"/>
 </form>
 <input class="btn btn-primary size-m radius" type="button" id="button" value="上传头像">
 <div id="result"></div>
 </div>
</body>
</html>

snippet_file_0.txt

下面是我后台处理方法,大家可以借鉴一下。后台是ssm框架,主要是保存图片和图片转码

//用户上传头像
 /**
 * 
 * @param image 选择的图片
 * @param model
 * @param userid 用户id
 * @param usertype 用户类型
 * @param request
 * @param originalimage 上一张临时图片
 * @return
 */
 @requestmapping(value="/imageupload",method=requestmethod.post)
 public string iconimageupload(@requestparam(value="file",required=false)multipartfile image,model model,@cookievalue("userid")string userid,httpservletrequest request,string originalimage){
 string basepath="image/";
 //web.xml里面配置的用户图片存储路径
 string userimagepath=request.getsession().getservletcontext().getinitparameter("userimagesavepath");
 //图片相对路径 
 string imagerelativepath=fileutils.fileupload(image, request,basepath+userimagepath);
 system.out.println("图片保存路径------"+imagerelativepath);
 system.out.println("上一张临时图片------"+originalimage);
 //删除上一张临时图片
 if(originalimage!=null){
 string basepathtemp=request.getsession().getservletcontext().getrealpath("/");
 fileutils.deletefile(basepathtemp+originalimage);
 }
 model.addattribute("imagerelativepath", imagerelativepath);
 model.addattribute("userid", userid);
 return "/crop_image"; 
 }
 //将裁剪好的头像由base64还原成图片
 @responsebody
 @requestmapping(value="/saveusericon",method=requestmethod.post)
 public msg saveusericon(string icon,@cookievalue("usertype")string usertype,@cookievalue("userid")string userid,string originalimage,httpservletrequest request){
 system.out.println("icon-----"+icon);
 //先生成图片地址
 string realpath=request.getsession().getservletcontext().getrealpath("/");
 string basepath="image/";
 string userimagepath=request.getsession().getservletcontext().getinitparameter("userimagesavepath");
 calendar now=calendar.getinstance();
 string relativepath=basepath+userimagepath+"/"+now.get(calendar.year)+"/"+(now.get(calendar.month)+1)+"/"+now.get(calendar.day_of_month)+"/"+fileutils.getuuid()+".png";
 string imagepath=realpath+relativepath;
 //将base64 转换成图片
 fileutils.base64toimage(icon, imagepath);
 //删除原图
 if(originalimage!=null){
 fileutils.deletefile(realpath+originalimage); 
 }
 return msg.success();
 }
 //下面是解码的方法
 public static boolean base64toimage(string base64, string path) {// 对字节数组字符串进行base64解码并生成图片 
  if (base64 == null){ // 图像数据为空 
   return false; 
  } 
  system.out.println(base64);
  // base64 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了
  base64=base64.split(",")[1];
  base64decoder decoder = new base64decoder(); 
  try { 
   // base64解码 
   byte[] bytes = decoder.decodebuffer(base64); 
   for (int i = 0; i < bytes.length; ++i) { 
    if (bytes[i] < 0) {// 调整异常数据 
     bytes[i] += 256; 
    } 
   } 
   // 生成图片 
   outputstream out = new fileoutputstream(path); 
   out.write(bytes); 
   out.flush(); 
   out.close(); 
   return true; 
  } catch (exception e) { 
   return false; 
  } 
 }

总结

以上所述是小编给大家介绍的使用cropper.js裁剪头像的实例代码,希望对大家有所帮助