Cropper.js
JavaScript 图片裁剪插件
目录
- Features
- Main
- Getting started
- Options
- Methods
- Events
- No conflict
- Browser support
- Contributing
- Versioning
- License
特点
- 支持 38 个选项
- 支持 27 个方法
- 支持 6 个事件
- 支持触摸 (移动设备)
- 支持缩放
- 支持旋转
- 支持等比 (翻转)
- 支持多个裁剪器
- 支持 canvas 裁切
- 支持通过 canvas 浏览器端裁切图片
- 支持转译 Exif Orientation 信息
- 跨浏览器支持
目录结构
dist/
├── cropper.css ( 5 KB)
├── cropper.min.css ( 4 KB)
├── cropper.js (90 KB, UMD)
├── cropper.min.js (33 KB, UMD, compressed)
├── cropper.common.js (90 KB, CommonJS)
└── cropper.esm.js (90 KB, ES Module)
入门
快速上手
可通过以下四步快速开始:
- 下载最新版本。
- 克隆仓库:
git clone https://github.com/fengyuanchen/cropperjs.git
。 - 用 NPM 安装:
npm install cropperjs
。 - 用 Bower 安装:
bower install cropperjs
。
安装
包含文件:
<link href="/path/to/cropper.css" rel="stylesheet">
<script src="/path/to/cropper.js"></script>
cdnjs 提供 CDN 服务,包括 Cropper.js 的 CSS 和 JavaScript。你可以从这个链接找到。
用法
用 Cropper
构造器初始化:
- Browser:
window.Cropper
- CommonJS:
var Cropper = require('cropperjs')
- ES2015:
import Cropper from 'cropperjs'
<div>
<img id="image" src="picture.jpg">
</div>
/* 限制图片宽度,防止移除容器 */
img {
max-width: 100%; /* 这个规则非常重要,不要忽视它! */
}
var image = document.getElementById('image');
var cropper = new Cropper(image, {
aspectRatio: 16 / 9,
crop: function(e) {
console.log(e.detail.x);
console.log(e.detail.y);
console.log(e.detail.width);
console.log(e.detail.height);
console.log(e.detail.rotate);
console.log(e.detail.scaleX);
console.log(e.detail.scaleY);
}
});
常见问题
放大缩小后如何裁切一个新区域?
双击你的鼠标进入裁切模式。
裁切一个区域后如何移动图片?
双击你的鼠标进入移动模式。
如何在自由比例模式下修正宽高比?
当你要重置裁切框的时候,按住
shift
键即可。
在自由比例模式下如何裁切一个正方形区域?
当你在裁切图片时按住
shift
键即可。
注意
-
cropper 的大小继承自图片父元素(容器),因此要使用一个 有效的块元素 来包裹图片。
如果在一个模块中使用 cropper,你应该等到模块显示完成再初始化 cropper。否则,cropper会出现问题。
-
基于原始图片尺寸输出裁切数据,因此你可以直接使用他妈来裁切图片。
-
如果你想裁切一张跨域图片,请确认你的浏览器支持 HTML5 CORS(跨域资源贡献) 设置属性, 并且你的图片服务器支持
Access-Control-Allow-Origin
选项 (参见 HTTP 访问控制 (CORS))。
已知问题
-
iOS 资源限制: 由于 iOS 设备限制存储,当你正在裁切一张较大图片 (iPhone 相机解析度)时浏览器可能崩溃。为了避免这个问题,你可以先调整图片大小 (最好低于 1024 像素) 在开始裁切之前。
-
图片尺寸增加: 当在浏览器端使用
HTMLCanvasElement.toDataURL
方法导出裁切过的图片时,导出图片的尺寸可能比原始图片还要大。原因是导出图片的类型和原图片不一致。因此要传递原图片的类型作为第一个参数到toDataURL
来修复这个问题。比如,如果原图片类型是 JPEG, 那么用cropper.getCroppedCanvas().toDataURL('image/jpeg')
来导出图片。
选项
你可以用 new Cropper(image, options)
来设置cropper 选项。如果你要改变默认全局选项,可以使用 Cropper.setDefaults(options)
。
名称 | 类型 | 说明 |
---|---|---|
viewMode(视图模式) |
|
选项:
定义 cropper 的视图模式。 |
dragMode(拖动模式) |
|
选项:
定义 cropper 的拖动模式。 |
aspectRatio(宽高比) |
|
设置裁切框的宽高比。默认情况下,裁切框是自由比例。 |
data(数据) |
|
如果你之前存储过裁切数据,当生成时会自动调用 |
preview(预览) |
|
为预览添加额外的元素(容器) 注意:
|
responsive(响应式) |
|
当改变窗口大小时重新渲染。 |
restore(恢复) |
|
当改变窗口大小时恢复裁切区域。 |
checkCrossOrigin(检查跨域) |
|
检查当前图片是否是一个跨域图片。 如果是,当克隆图片时,克隆图片元素会被添加一个 通过在图片上添加 如果图片的 |
checkOrientation(判断方向) |
|
检查当前图片的 Exif Orientation 信息。(包含图片的拍摄相机,时间,拍摄方向等信息,译者注) 更确切的说,读取方向的值用来旋转图片,然后将 Orientation 值设置为 需要同时设置 注意: 始终不要相信这一点,因为一些 JPG 图片的 Orientation 值是不正确的(不标准的)。 |
modal(模态) |
|
在图片的上面,裁切框的下面显示黑色模态层。 |
guides(指示) |
|
在裁切框上面显示虚线。 |
center(居中) |
|
在裁切框上面居中显示指针。 |
highlight(高亮) |
|
在裁切框上面显示白色模态层 (高亮裁切框)。 |
background(背景) |
|
在容器上显示网格。 |
autoCrop(自动裁切) |
|
启用后当初始化时自动裁切图片。 |
autoCropArea(自动裁切区域) |
|
一个介于 0 和 1. 之间的数值,来定义裁切区域的大小(百分比)。 |
movable(可移动) |
|
启用后可移动图片。 |
rotatable(可旋转) |
|
启用后可旋转图片。 |
scalable(可伸缩) |
|
启用后可伸缩图片。 |
zoomable(可缩放) |
|
启用后可缩放图片。 |
zoomOnTouch(触摸缩放) |
|
启用后可通过触摸拖动来缩放图片。 |
zoomOnWheel(滚轮缩放) |
|
启用后可通过鼠标滚轮来缩放图片。 |
wheelZoomRatio(滚轮缩放比) |
|
定义当通过鼠标滚轮缩放图片时的缩放比例。 |
cropBoxMovable(裁切框可移动) |
|
启用后当拖动时可移动裁切框。 |
cropBoxResizable(裁切框大小可改变) |
|
启用后当拖动时可改变裁切框的大小。 |
toggleDragModeOnDblclick(双击切换裁切模式) |
|
启用后,当在cropper上双击时,可在 "crop" 和 "move" 模式之间切换。 |
minContainerWidth(最小容器宽度) |
|
容器的最小宽度。 |
minContainerHeight(最小容器高度) |
|
容器的最小高度。 |
minCanvasWidth(最小canvas宽度) |
|
canvas的最小宽度 (图片容器)。 |
minCanvasHeight(最小canvas高度) |
|
canvas的最小高度 (图片容器)。 |
minCropBoxWidth(最小裁切框宽度) |
|
裁切框的最小宽度。 注意: 这个大小是相对于页面,而不是图片。 |
minCropBoxHeight(最小裁切框高度) |
|
裁切框的最小高度。 注意: 这个大小是相对于页面,而不是图片。 |
ready |
|
一个 "ready" 事件的快捷方式。 |
cropstart |
|
一个 "cropstart" 事件的快捷方式 |
cropmove |
|
一个 "cropmove" 事件的快捷方式。 |
cropend |
|
一个 "cropend" 事件的快捷方式。 |
crop |
|
一个 "crop" 事件的快捷方式。 |
zoom |
|
一个 "zoom" 事件的快捷方式。 |
方法
因此在加载图片时有一个 异步 进程,你 会调用到绝大多数方法,在ready之后, 除了 "setAspectRatio", "replace" 和 "destroy"。
如果一个方法不需要任何返回值,它会返回 cropper 实例 (this
) 来进行链式结构。
new Cropper(image, {
ready: function () {
// this.cropper[method](argument1, , argument2, ..., argumentN);
this.cropper.move(1, -1);
// 允许链式结构
this.cropper.move(1, -1).rotate(45).scale(1, -1);
}
});
crop()
手动显示裁切框。
new Cropper(image, {
autoCrop: false,
ready: function () {
// Do something here
// ...
// And then
this.cropper.crop();
}
});
reset()
重置图片和裁切框到初始状态。
clear()
清除裁切框。
replace(url[, onlyColorChanged])
-
url:
- 类型:
String
- 一个新图片的url。
- 类型:
-
onlyColorChanged (可选):
- 类型:
Boolean
- 如果仅改变颜色,而不是大小,那么 cropper 只需要改变所有相关图片的src,无需重新构建 cropper。它可以用于滤镜。
- 如果不存在,它的默认值为
false
。
- 类型:
替换图片的src并重新构建 cropper。
enable()
启用(解冻) cropper。
disable()
禁用 (冻结)cropper。
destroy()
销毁 cropper 并从图片中移除实例。
move(offsetX[, offsetY])
-
offsetX:
- 类型:
Number
- 在水平方向的移动距离 (px) 。
- 类型:
-
offsetY (可选):
- 类型:
Number
- 在垂直方向上的移动距离 (px) 。
- 如果不存在,默认值为
offsetX
。
- 类型:
移动 canvas (图片容器) 相对偏移。
cropper.move(1);
cropper.move(1, 0);
cropper.move(0, -1);
moveTo(x[, y])
-
x:
- 类型:
Number
- canvas 的
left
值
- 类型:
-
y (可选):
- 类型:
Number
- canvas的
top
值 - 如果不存在,默认值为
x
。
- 类型:
移动 canvas (图片容器)到一个绝对的点。
zoom(ratio)
- ratio:
- 类型:
Number
- 放大: 需要一个正数 (ratio > 0)
- 缩小: 需要一个负数 (ratio < 0)
- 类型:
以一个相对的比例缩放 canvas(图片容器)。
cropper.zoom(0.1);
cropper.zoom(-0.1);
zoomTo(ratio)
- ratio:
- 类型:
Number
- 类型:
缩放canvas (图片容器) 到一个绝对的比例。
cropper.zoomTo(1); // 1:1 (canvasData.width === canvasData.naturalWidth)
rotate(degree)
- degree:
- 类型:
Number
- 右旋转: 需要一个正数 (degree > 0)
- 左旋转: 需要一个负数 (degree < 0)
- 类型:
旋转图片到一个相对的角度。
依赖 CSS3 2D Transforms 支持 (IE 9+).
cropper.rotate(90);
cropper.rotate(-90);
rotateTo(度)
- degree:
- 类型:
Number
- 类型:
旋转图片到一个绝对的度数。
scale(scaleX[, scaleY])
-
scaleX:
- 类型:
Number
- 默认:
1
- 应用于图像横坐标的缩放条件。
- 当它等于
1
时,没有效果。
- 类型:
-
scaleY (可选):
- 类型:
Number
- 应用于图像纵坐标的缩放条件。
- 如果不存在,默认值为
scaleX
。
- 类型:
缩放图片。
依赖 CSS3 2D Transforms 支持 (IE 9+)。
cropper.scale(-1); // Flip both horizontal and vertical
cropper.scale(-1, 1); // Flip horizontal
cropper.scale(1, -1); // Flip vertical
scaleX(scaleX)
- scaleX:
- 类型:
Number
- 默认:
1
- 应用于图像横坐标的缩放条件。
- 当它等于
1
时,没有效果。
- 类型:
缩放图片的横坐标。
scaleY(scaleY)
- scaleY:
- 类型:
Number
- 默认:
1
- 应用于图像纵坐标的缩放条件。
- 如果不存在,默认值为
scaleX
。
- 类型:
缩放图片的纵坐标。
getData([rounded])
-
rounded (可选):
- 类型:
Boolean
- 默认:
false
- 设置为
true
会得到(rounded values)。
- 类型:
-
(返回值):
- 类型:
Object
- 属性:
x
: 裁切区域的左偏移y
: 裁切区域的上偏移width
: 裁切区域的宽度height
: 裁切区域的高度rotate
: 图片的旋转度数scaleX
: 应用于图像横坐标的缩放值scaleY
: 应用于图像纵坐标的缩放值
- 类型:
输出最终裁切区域的位置和尺寸数据 (基于原图片的自然大小)。
你可以直接将裁切图片发送到服务器端。
setData(data)
- data:
- 类型:
Object
- 属性: 参加
getData
方法。 - 在传入之前,你可能需要舍弃数据属性。(round the data properties)
- 类型:
用新数据改变裁切区域的位置和大小 (基于原始图片)。
注意: 仅当viewMode
模式选项的值大于或等于1
时,该方法可用。
getContainerData()
- (返回值):
- 类型:
Object
- 属性:
width
: 当前容器的宽度height
: 当前容器的高度
- 类型:
输出容器的尺寸数据。
getImageData()
- (返回值):
- 类型:
Object
- 属性:
left
: 图片的左偏移top
: 图片的上偏移width
: 图片的宽度height
: 图片的高度naturalWidth
: 图片的自然宽度naturalHeight
: 图片的自然高度aspectRatio
: 图片的宽高比rotate
: 图片的旋转度数,如果旋转过scaleX
: 应用于图片横坐标的缩放值,如果缩放过scaleY
: 应用与图片纵坐标的缩放值,如果缩放过
- 类型:
输出图片的位置,尺寸和其他相关数据。
getCanvasData()
- (返回值):
- 类型:
Object
- 属性:
left
: canvas的左偏移top
: canvas的上偏移width
: canvas的宽度height
: canvas的高度naturalWidth
: canvas的自然宽度 (只读)naturalHeight
: canvas的自然高度 (只读)
- 类型:
输出canvas (图片容器) 位置和尺寸数据。
var imageData = cropper.getImageData();
var canvasData = cropper.getCanvasData();
if (imageData.rotate % 180 === 0) {
console.log(canvasData.naturalWidth === imageData.naturalWidth); // true
}
setCanvasData(data)
- data:
- 类型:
Object
- 属性:
left
: canvas的新左偏移量top
: canvas的新上偏移量width
: canvas的新宽度height
: canvas的新高度
- 类型:
用新数据改变canvas (图片容器) 的位置和尺寸。
getCropBoxData()
- (返回值):
- 类型:
Object
- 属性:
left
: 裁切框的左偏移top
: 裁切框的上偏移width
: 裁切框的宽度height
: 裁切框的高度
- 类型:
输出裁切框的位置和尺寸数据。
setCropBoxData(data)
- data:
- 类型:
Object
- 属性:
left
: 裁切框新的左偏移top
: 裁切框新的上偏移width
: 裁切框新宽度height
: 裁切框新高度
- 类型:
用新数据改变裁切框的位置和尺寸。
getCroppedCanvas([options])
-
options (optional):
- 类型:
Object
- 属性:
width
: 输出canvas的最终宽度height
: 输出canvas的最终高度fillColor
: 输出填充canvas的填充颜色的 alpha 值beforeDrawImage(canvas)
: 在canvas上绘制裁切图片前的一个用来转换canvas的函数。
- 注意: 输出canvas的宽高比会自动适配裁切框的宽高比。
- 类型:
-
(返回值):
- 类型:
HTMLCanvasElement
- 一个绘制裁切图片的 canvas 。
- 类型:
-
浏览器支持:
得到一个绘制裁切图片的canvas。如果没有裁切,将返回整个canvas。
然后,你可以直接将canvas作为一个图片展示,或者用 HTMLCanvasElement.toDataURL 得到一个 Data URL, 或者用 HTMLCanvasElement.toBlob 得到一个 blob 对象,然后使用 FormData 将它上传到服务器,前提是浏览器支持这项 API。
cropper.getCroppedCanvas();
cropper.getCroppedCanvas({
width: 160,
height: 90,
beforeDrawImage: function(canvas) {
const context = canvas.getContext('2d');
context.imageSmoothingEnabled = false;
context.imageSmoothingQuality = 'high';
},
});
// Upload cropped image to server if the browser supports `HTMLCanvasElement.toBlob`
cropper.getCroppedCanvas().toBlob(function (blob) {
var formData = new FormData();
formData.append('croppedImage', blob);
// Use `jQuery.ajax` method
$.ajax('/path/to/upload', {
method: "POST",
data: formData,
processData: false,
contentType: false,
success: function () {
console.log('Upload success');
},
error: function () {
console.log('Upload error');
}
});
});
setAspectRatio(aspectRatio)
- aspectRatio:
- 类型:
Number
- 必须是一个正数。
- 类型:
改变裁切框的宽高比。
setDragMode([mode])
- mode (可选):
- 类型:
String
- 默认:
'none'
- 选项:
'none'
,'crop'
,'move'
- 类型:
改变拖动模式。
提醒: 你可以在cropper 上双击来切换 "crop" 和 "move" 模式。
事件
ready
这个事件会在目标图片已经加载好并且 cropper 实例已经就绪。
var cropper;
image.addEventListener('ready', function () {
console.log(this.cropper === cropper);
// -> true
});
cropper = new Cropper(image);
cropstart
-
event.detail.originalEvent:
- 类型:
Event
- 选项:
mousedown
,touchstart
和pointerdown
- 类型:
-
event.detail.action:
- 类型:
String
- 选项:
'crop'
: 创建一个新裁切框'move'
: 移动canvas (图片容器)'zoom'
: 触摸缩放canvas (图片容器)'e'
: 调整裁切框的东边'w'
: 调整裁切框的西边's'
: 调整裁切框的南边'n'
: 调整裁切框的北边'se'
: 调整裁切框的东南边'sw'
: 调整裁切框的西南边'ne'
: 调整裁切框的东北边'nw'
: 调整裁切框的西北边'all'
: 移动裁切框 (所有方向)
- 类型:
这个事件会在canvas (图片容器) 或者裁切框开始改变的时候触发。
image.addEventListener('cropstart', function (e) {
console.log(e.detail.originalEvent);
console.log(e.detail.action);
});
cropmove
-
event.detail.originalEvent:
- 类型:
Event
- 选项:
mousemove
,touchmove
和pointermove
。
- 类型:
-
event.detail.action: 同 "cropstart"。
这个事件会在canvas (图片容器) 或者裁切框正在改变的时候触发。
cropend
-
event.detail.originalEvent:
- 类型:
Event
- 选项:
mouseup
,touchend
,touchcancel
,pointerup
和pointercancel
.
- 类型:
-
event.detail.action: 同 "cropstart".
这个事件会在canvas (图片容器) 或者裁切框停止改变的时候触发。
crop
- event.detail.x
- event.detail.y
- event.detail.width
- event.detail.height
- event.detail.rotate
- event.detail.scaleX
- event.detail.scaleY
关于这些属性,参见 getData
方法。
This event fires when the canvas (image wrapper) or the crop box changed.
zoom
-
event.detail.originalEvent:
- 类型:
Event
- 选项:
wheel
,touchmove
.
- 类型:
-
event.detail.oldRatio:
- 类型:
Number
- canvas的旧(当前)比例
- 类型:
-
event.detail.ratio:
- 类型:
Number
- canvas的新 (未来) 比例 (
canvasData.width / canvasData.naturalWidth
)
- 类型:
这个事件会在一个cropper实例开始缩放 canvas(图片容器)时触发。
image.addEventListener('zoom', function (e) {
// Zoom in
if (e.detail.ratio > e.detail.oldRatio) {
e.preventDefault(); // Prevent zoom in
}
// Zoom out
// ...
});
避免冲突
如果在同一个命名空间内必须用其它裁切插件, 只需要调用一下 Cropper.noConflict
静态方法还原即可。
浏览器支持
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Opera (latest)
- Edge (latest)
- Internet Explorer 9+
贡献
请通读我们的 contributing guidelines。
Versioning
Maintained under the Semantic Versioning guidelines.
License
Related projects
- iron-cropper (web component) by @safetychanger
- react-cropper by @roadmanfong
- vue-cropperjs by @Agontuk