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

开始先放个成品图:
下面给出前后端的代码
前端页面是一个单独的jsp页面,用来做弹出层来裁剪图片比较好。
关于jsp页面引用的两个关于cropper的 文件,我就不提供了。大家需要的可以去官方的github上去下载。
地址:https://github.com/fengyuanchen/cropper
<%@ 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裁剪头像的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# cropper.js
# 裁剪
# 头像
# Cropper.js进阶之裁剪后保存至服务器实现详解
# Cropper.js进阶之固定宽高图片裁切实现示例
# cropper.js和exif.js实现头像上传缩放裁剪旋转
# 基于cropper.js封装vue实现在线图片裁剪组件功能
# Cropper.js进阶之裁剪后保存至本地实现示例
# 表单
# 小编
# 的是
# 都是
# 是一个
# 上传
# 在此
# 就不
# 给大家
# 弹出
# 比较好
# 此类
# 找了
# 我做
# 你所
# 不支持
# 只需要
# 还不错
# 过大
# 所要
相关文章:
Android滚轮选择时间控件使用详解
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何高效利用200m空间完成建站?
宝塔建站无法访问?如何排查配置与端口问题?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何快速搭建支持数据库操作的智能建站平台?
营销式网站制作方案,销售哪个网站招聘效果最好?
装修招标网站设计制作流程,装修招标流程?
建站之星如何快速生成多端适配网站?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
建站之星如何保障用户数据免受黑客入侵?
如何制作网站标识牌,动态网站如何制作(教程)?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
TestNG的testng.xml配置文件怎么写
深入理解Android中的xmlns:tools属性
如何选择建站程序?包含哪些必备功能与类型?
股票网站制作软件,网上股票怎么开户?
教学网站制作软件,学习*后期制作的网站有哪些?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何在IIS中新建站点并配置端口与IP地址?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
简历在线制作网站免费版,如何创建个人简历?
如何快速搭建二级域名独立网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何通过IIS搭建网站并配置访问权限?
北京网站制作的公司有哪些,北京白云观官方网站?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何快速搭建虚拟主机网站?新手必看指南
,想在网上投简历,哪几个网站比较好?
网站制作模板下载什么软件,ppt模板免费下载网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
建站OpenVZ教程与优化策略:配置指南与性能提升
C#如何在一个XML文件中查找并替换文本内容
建站主机是什么?如何选择适合的建站主机?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
建站之星如何实现网站加密操作?
建站之星收费标准详解:套餐费用及年费价格表一览
淘宝制作网站有哪些,淘宝网官网主页?
建站之星安装后如何自定义网站颜色与字体?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何通过.red域名打造高辨识度品牌网站?
威客平台建站流程解析:高效搭建教程与设计优化方案
济南专业网站制作公司,济南信息工程学校怎么样?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
*请认真填写需求信息,我们会在24小时内与您取得联系。