使用cropper.js裁剪头像的实例代码
程序员文章站
2022-09-02 16:29:15
最近项目需要头像裁剪的功能,在网上找了一下,发现了github上的cropper项目还不错,借鉴了一下。。用起来挺简单的,下面是我做的一个小例子:
开始先放个成品图:...
最近项目需要头像裁剪的功能,在网上找了一下,发现了github上的cropper项目还不错,借鉴了一下。。用起来挺简单的,下面是我做的一个小例子:
开始先放个成品图:
下面给出前后端的代码
前端页面是一个单独的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裁剪头像的实例代码,希望对大家有所帮助