前端图像 裁剪利器 JQuerJjcrop+裁剪图像保存教程
由于一个项目中需要用到用户头像上传裁剪组件,这两天便网上找了一些相关插件,主要由以下几种插件:
1、Image Cropper:http://elemefe.github.io/image-cropper/#demo
2、flash头像上传组件:http://www.hdfu.net/index.html(可惜是收费的)
3、jQuery Jcrop:http://code.ciaoca.com/jquery/jcrop/
本着开源免费的态度,第二种要收费的插件自然不纳入考虑学习的范围。
本文主要是讲解jQuery Jcrop的基本用法以及和后端(这里采用java)相结合,保存裁剪后的图像。
效果图如下:

第一步:下载相关文件
当然是去jQuery Jcrop官网下载jQuery Jcrop插件所需的css和js文件,下载过程这里就不详细介绍了。
第二步 介绍jQuery Jcrop基本用法
1、使用方法
2、参数说明
3、API接口
(一)使用方法
1、引入css文件
<link rel="stylesheet" href="resources/jcrop/css/jquery.Jcrop.min.css" type="text/css" />
2、引入js文件
<script src="resources/jcrop/js/jquery.min.js"></script>
<script src="resources/jcrop/js/jquery.Jcrop.min.js"></script>
3、给需要裁剪的图片加上id标签
<img src="resources/fj.jpg" id="target" />
这里给图片加上id=“target”
4、调用Jcrop
$('#target').Jcrop({
//在这里添加所需要的参数
});
调用Jcrop的时候,可以在方法里面添加Jcrop所提供的各种参数、事件,比如可以添加onChange()事件
(二)参数说明
| 名称 | 默认值 | 说明 |
|---|---|---|
| allowSelect | true | 允许新选框 |
| allowMove | true | 允许选框移动 |
| allowResize | true | 允许选框缩放 |
| trackDocument | true | 拖动选框时,允许超出图像以外的地方时继续拖动。 |
| baseClass | 'jcrop' | 基础样式名前缀。说明:class="jcrop-holder",更改的只是其中的 jcrop。
例:假设值为 "test",那么样式名会更改为 "test-holder" |
| addClass | null | 添加样式。
例:假设值为 "test",那么会添加样式到 |
| bgColor | 'black' | 背景颜色。颜色关键字、HEX、RGB 均可。 |
| bgOpacity | 0.6 | 背景透明度 |
| bgFade | false | 使用背景过渡效果 |
| borderOpacity | 0.4 | 选框边框透明度 |
| handleOpacity | 0.5 | 缩放按钮透明度 |
| handleSize | 9 | 缩放按钮大小 |
| aspectRatio | 0 | 选框宽高比。说明:width/height |
| keySupport | true | 支持键盘控制。按键列表:上下左右(移动选框)、Esc(取消选框) |
| createHandles | ['n','s','e','w','nw','ne','se','sw'] | 设置边角控制器 |
| createDragbars | ['n','s','e','w'] | 设置边框控制器 |
| createBorders | ['n','s','e','w'] | 设置边框 |
| drawBorders | true | 绘制边框 |
| dragEdges | true | 允许拖动边框 |
| fixedSupport | true | 支持 fixed,例如:IE6、iOS4 |
| touchSupport | null | 支持触摸事件 |
| shade | 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(){} | 选框选定时的事件 |
| onDblClick | function(){} | 在选框内双击时的事件 |
| onRelease | function(){} | 取消选框时的事件 |
(三)API接口
| 名称 | 说明 |
|---|---|
| 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] |
第三步:前端页面中实际使用
在我的页面中,我使用了实时预览裁剪图片的功能。如果需要更多功能,可以参照demo中的文件。
首先贴上js代码部分
$(function(){
var jcrop_api, boundx, boundy,
// Grab some information about the preview pane
$preview = $('#preview-pane'), $pcnt = $('#preview-pane .preview-container'), $pimg = $('#preview-pane .preview-container img'),
xsize = $pcnt.width(), ysize = $pcnt.height();
console.log('init', [ xsize, ysize ]);
$('#target').Jcrop({
onChange : updatePreview,
onSelect : updatePreview,
aspectRatio : xsize / ysize //设为1则为正方形
}, function() {
// Use the API to get the real image size
var bounds = this.getBounds();
boundx = bounds[0];
boundy = bounds[1];
// Store the API in the jcrop_api variable
jcrop_api = this; // Move the preview into the jcrop container for css positioning
$preview.appendTo(jcrop_api.ui.holder);
});
function updatePreview(c) {
$('#x1').val(c.x);
$('#y1').val(c.y);
$('#x2').val(c.x2);
$('#y2').val(c.y2);
$('#w').val(c.w);
$('#h').val(c.h);
if (parseInt(c.w) > 0) {
var rx = xsize / c.w;
var ry = ysize / c.h;
$pimg.css({
width : Math.round(rx * boundx) + 'px',
height : Math.round(ry * boundy) + 'px',
marginLeft : '-' + Math.round(rx * c.x) + 'px',
marginTop : '-' + Math.round(ry * c.y) + 'px'
});
}
}
});
//这个函数是用来与后端交互,进行上传图片。上传图片成功后,返回图片的url
function cut() {
$.ajax({
type : "get",
url : "JCropServlet?t=" + new Date(),
data : {
"x1" : $('#x1').val(),
"x2" : $('#x2').val(),
"y1" : $('#y1').val(),
"y2" : $('#y2').val()
},
dataType : "text",
success : function(data) {
$("#result").css("display", "block");
$("#result").attr("src", "resources/" + data);
// location.reload();
},
error : function(data) {
alert(data);
}
});
}
接下来是jsp的代码
<!-- 原图片 -->
<img src="resources/fj.jpg" id="target" />
<form id="coords" onSubmit="return false;" method="get" action="JCropServlet">
<div class="inline-labels">
<label>X1 <input type="text" size="4" id="x1" name="x1" /></label>
<label>Y1 <input type="text" size="4" id="y1" name="y1" /></label>
<label>X2<input type="text" size="4" id="x2" name="x2" /></label>
<label>Y2 <input type="text" size="4" id="y2" name="y2" /></label>
<label>W <input type="text" size="4" id="w" name="w" /></label>
<label>H<input type="text" size="4" id="h" name="h" />
</label>
</div>
<button onclick="cut()">提交</button>
</form>
//这个div是用来实时预览实时裁剪的图像
<div id="preview-pane">
<div class="preview-container">
<img src="resources/fj.jpg" class="jcrop-preview" alt="Preview" />
</div>
</div>
<!-- 截图后的图片 -->
<img src="" id="result" style="display: none">
预览实时裁剪图像div的css代码
#preview-pane{
display: block;
position: absolute;
z-index:;
top: 10px;
right: 30px;
padding: 6px;
border: 1px rgba(0,0,0,.4) solid;
background-color: white;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
}
#preview-pane .preview-container {
width: 250px;
height: 250px;
overflow: hidden;
}
第四步:后端接受图片,保存到本地。并通过返回图片url到前端页面。
public class JCropServlet extends HttpServlet {
public JCropServlet() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取截取图片的坐标
int x1=Integer.parseInt(request.getParameter("x1"));
int y1=Integer.parseInt(request.getParameter("y1"));
int x2=Integer.parseInt(request.getParameter("x2"));
int y2=Integer.parseInt(request.getParameter("y2"));
//获取根路径
String rootPath=request.getServletContext().getRealPath("/");
String src=rootPath+File.separator+"resources"+File.separator+"fj.jpg";
String name = "fj_crop_" + this.dateFormat() + ".jpg";
String dest=rootPath+File.separator+"resources"+File.separator+name;
ImageUtils.delete(rootPath+File.separator+"resources");
ImageUtils.cut(src, dest, x1, y1, x2, y2);
PrintWriter out=response.getWriter();
//返回图片url
out.print(name);
out.close();
}
private String dateFormat(){
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
return df.format(new Date());
}
}
附上demo源码:
http://pan.baidu.com/s/1gdvVMTX
前端图像 裁剪利器 JQuerJjcrop+裁剪图像保存教程的更多相关文章
- Opencv-Python:图像尺寸、图像的读取、显示、保存与复制
Opencv-Python:图像尺寸.图像的读取.显示.保存与复制 原创 2017年11月23日 21:30:49 4440 在使用opencv的方法时,首先必须导入opencv包.新的opencv导 ...
- OpenCV中图像的读取,显示与保存
图像的读取,显示与保存 相关函数:cv2.imread().cv2.imshow().cv2.imwrite() 1.读入图像: 用cv2.imread()函数来读取图像,cv2.imread(路 ...
- opencv中图像的读取,显示与保存1
1.读入图像 用cv2.imread()函数来读取图像,cv2.imread(路径,图像颜色空间)(其中颜色空间默认为BGR彩图) cv2.IMREAD_COLOR:读入一副彩色图像 cv2. ...
- 从单一图像中提取文档图像:ICCV2019论文解读
从单一图像中提取文档图像:ICCV2019论文解读 DewarpNet: Single-Image Document Unwarping With Stacked 3D and 2D Regressi ...
- 深入学习OpenCV中图像灰度化原理,图像相似度的算法
最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...
- VC++ 在使用 CImage 的Draw 输入一个图像时,有时候会造成图像失真严重,解决的方法如下
VC++ 在使用 CImage 的Draw 输入一个图像时,有时候会造成图像失真严重,解决的方法如下 失真主要是由于变形造成的.只要设置一下变形的模式就可以了 ::SetStretchBltMode ...
- web前端自动化测试/爬虫利器puppeteer介绍
web前端自动化测试/爬虫利器puppeteer介绍 Intro Chrome59(linux.macos). Chrome60(windows)之后,Chrome自带headless(无界面)模式很 ...
- [python-opencv]图像二值化【图像阈值】
图像二值化[图像阈值]简介: 如果灰度图像的像素值大于阈值,则为其分配一个值(可以是白色255),否则为其分配另一个值(可以是黑色0) 图像二值化就是将灰度图像上的像素值设置为0或255,也就是将整个 ...
- 图像切割—基于图的图像切割(Graph-Based Image Segmentation)
图像切割-基于图的图像切割(Graph-Based Image Segmentation) Reference: Efficient Graph-Based Image Segmentation ...
随机推荐
- 110个经常使用Oracle函数总结
1. ASCII 返回与指定的字符相应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...
- C++语言笔记系列之十八——虚函数(1)
1.C++中的多态 (1)多态性:同一个函数的调用能够进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接.即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态 ...
- 棋盘覆盖问题python3实现
在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖全部棋盘上的其余全部方格,不能重叠. 代码例如以下: def chess(tr,tc,pr,pc,size): globa ...
- 如何使用scss/sass
SCSS 与 Sass 异同:http://sass.bootcss.com/docs/scss-for-sass-users/: 欢迎加入前端交流群来py: 转载请标明出处! 废话不多说,直接进入正 ...
- [雅礼NOIP2018集训 day4]
感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...
- .net core @Html 自定义属性中包含特殊符号解决
最近自己在练手项目用到了VUE 绑定属性的时候发现 有: -符号 这样显然是不支持的.之前发现 v-on 这种-符号也是不支持的 但是可用 @v_on 替代.可是找遍了所有资料也没找到:转义符 当时 ...
- GetExecutingAssembly() 和 GetCallingAssembly() 的区别
在TCX_1710项目代码的启动项目根目录路径下的Global.asax.cs配置文件中的MVCApplication类中的Application_Start()方法中,配置了项目启动时要加载的项目信 ...
- C语言中的作用域、链接属性与存储属性
C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...
- Intellij IDEA 2018.3激活破解方法(解决key is invalid)
1.程序安装包: https://download.jetbrains.8686c.com/idea/ideaIU-2018.3.exe 2.破解补丁:http://idea.lanyus.com/j ...
- [转载]vim常用命令总结
内容出处https://www.jianshu.com/p/a8ab13cff1ea 如有侵权请告知 移动.跳转 h.j.k.l:分别对应左.下.上.右.按键盘分布,从左到右,逆时针. w:移动到下一 ...