cropperjs详解
image.png
1.引入cropperjs
cnpm install cropperjs --saveimport Cropper from 'cropperjs'import 'cropperjs/dist/cropper.css'
2.使用插件
<template> <div> <div class="cropper-content"> <!-- 剪裁框 --> <div class="cropper"> <img ref="image" :src="imgFile" alt=""> </div> <!-- 预览框 --> <div class="show-preview" :style="{ overflow: 'hidden', margin: '0 25px', display: 'flex', 'align-items': 'center' }" > <div class="preview before" /> </div> </div> <div class="footer-btn"> <!-- 缩放旋转按钮 --> <div class="scope-btn"> <el-tooltip class="item" effect="dark" content="放大" placement="top"> <el-button icon="el-icon-zoom-in" @click="cropperzoom(0.05)" /> </el-tooltip> <el-tooltip class="item" effect="dark" content="缩小" placement="top"> <el-button icon="el-icon-zoom-out" @click="cropperzoom(-0.05)" /> </el-tooltip> <el-tooltip class="item" effect="dark" content="逆时针旋转" placement="top" > <el-button icon="el-icon-refresh-left" @click="cropperRotate(-90)" /> </el-tooltip> <el-tooltip class="item" effect="dark" content="顺时针旋转" placement="top" > <el-button icon="el-icon-refresh-right" @click="cropperRotate(90)" /> </el-tooltip> </div> <!-- 确认上传按钮 --> <div class="upload-btn"> <!-- <el-button type="primary" @click="uploadImg('blob')">上传</el-button> --> <el-button @click="closeCropper">取消</el-button> <el-button type="primary" :disabled="isDisabled" @click="sureSava()" >确定</el-button> </div> </div> </div></template><script>import Cropper from 'cropperjs' import 'cropperjs/dist/cropper.css' export default { name: 'VueCropper', props: { imgFile: { type: String, default: '' }, autoCropWidth: { type: Number, default: 0 }, autoCropHeight: { type: Number, default: 0 }, }, data() { return { myCropper: null, afterImg: '', ScaleX: 1, ScaleY: 1, fixed: false, fixedBox: false, inputRotate: 0, isDisabled: false } }, computed: {}, watch: { imgFile: function(file) { this.imgFile = file } }, mounted() { this.init() }, methods: { closeCropper() { this.$emit('closeCropper') }, handleChangeRotate(value) { this.cropperrotateTo(value) }, init() { this.myCropper = new Cropper(this.$refs.image, { viewMode: 1, dragMode: 'move', // initialAspectRatio: 1, preview: '.before', background: false, autoCropArea: 1, zoomOnWheel: true, aspectRatio: this.autoCropWidth / this.autoCropHeight // movable :true, // rotatable :true }) }, // 裁剪 uploadImgs() { this.afterImg = this.myCropper .getCroppedCanvas({ imageSmoothingQuality: 'high' }) .toDataURL('image/jpeg') this.$emit('getCrop', this.afterImg) }, sureSava() { this.afterImg = this.myCropper .getCroppedCanvas({ imageSmoothingQuality: 'high' }) .toDataURL('image/jpeg') this.$emit('upload', this.base64ToBlob(this.afterImg)) }, base64ToBlob(code) { const parts = code.split(';base64,') const contentType = parts[0].split(':')[1] const raw = window.atob(parts[1]) const rawLength = raw.length const uInt8Array = new Uint8Array(rawLength) for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i) } return new Blob([uInt8Array], { type: contentType }) }, // 缩放 cropperzoom(val) { this.myCropper.zoom(val) }, // 重置 cropperReset() { this.myCropper.reset() this.ScaleX = 1 this.ScaleY = 1 }, // 移动 croppermove(val1, val2) { this.myCropper.move(val1, val2) }, // 旋转 cropperRotate(val) { this.myCropper.rotate(val) }, // 绝对角度旋转 cropperrotateTo(val) { this.myCropper.rotateTo(val) }, // X轴翻转 cropperScaleX() { this.ScaleX = -this.ScaleX if (this.myCropper.getImageData().rotate === -90 || this.myCropper.getImageData().rotate === 90) { this.myCropper.scaleY(this.ScaleX) } else { this.myCropper.scaleX(this.ScaleX) } }, // y轴翻转 cropperScaleY() { // console.log(this.myCropper.getImageData().rotate) this.ScaleY = -this.ScaleY if (this.myCropper.getImageData().rotate === -90 || this.myCropper.getImageData().rotate === 90) { this.myCropper.scaleX(this.ScaleY) } else { this.myCropper.scaleY(this.ScaleY) } } } }</script><style lang="scss" scoped>.cropper { border: 1px solid #fff; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC); img{ width: 100%; opacity: 0; } } .cropper-content { display: flex; display: -webkit-flex; justify-content: flex-end; -webkit-justify-content: flex-end; } .cropper-content .cropper { width: 550px; height: 400px; overflow: hidden; } .cropper-content .show-preview { flex: 1; -webkit-flex: 1; display: flex; display: -webkit-flex; justify-content: center; -webkit-justify-content: center; overflow: hidden; /* border: 1px solid #cccccc; */ background: #cccccc; margin-left: 40px; } .preview { overflow: hidden; border: 1px solid #468ac8; background: #cccccc; } .footer-btn { margin-top: 30px; display: flex; display: -webkit-flex; justify-content: flex-end; -webkit-justify-content: flex-end; } .footer-btn .scope-btn { width: 260px; display: flex; display: -webkit-flex; justify-content: space-between; -webkit-justify-content: space-between; } .footer-btn .scope-btn span { display: inline-block; padding: 10px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); border-radius: 5px; background: #fff; cursor: pointer; } .footer-btn .scope-btn span i { font-size: 32px; color: #333333; } .footer-btn .upload-btn { flex: 1; -webkit-flex: 1; display: flex; display: -webkit-flex; justify-content: flex-end; -webkit-justify-content: flex-end; margin-right: 25px; } .footer-btn .btn { outline: none; display: inline-block; line-height: 1; white-space: nowrap; cursor: pointer; -webkit-appearance: none; text-align: center; -webkit-box-sizing: border-box; box-sizing: border-box; outline: 0; margin: 0; -webkit-transition: 0.1s; transition: 0.1s; font-weight: 500; padding: 8px 15px; font-size: 12px; border-radius: 3px; color: #fff; background-color: #67c23a; border-color: #67c23a; } .solide { margin-left: 25px; width: 200px; } .before { width: 100%; height: 100%; overflow: hidden; /* 这个属性可以得到想要的效果 */ }</style>
详细参数如下(部分)
配置对象
https://github.com/fengyuanchen/cropperjs
注意:第一个值为默认值
viewMode 视图控制
0 无限制
1 限制裁剪框不能超出图片的范围
2 限制裁剪框不能超出图片的范围 且图片填充模式为 cover 最长边填充
3 限制裁剪框不能超出图片的范围 且图片填充模式为 contain 最短边填充
dragMode 拖拽图片模式
crop 形成新的裁剪框
move 图片可移动
none 什么也没有
initialAspectRatio 裁剪框宽高比的初始值 默认与图片宽高比相同 只有在aspectRatio没有设置的情况下可用
aspectRatio 设置裁剪框为固定的宽高比
data 之前存储的裁剪后的数据 在初始化时会自动设置 只有在autoCrop设置为true时可用
preview 预览 设置一个区域容器预览裁剪后的结果
Element, Array (elements), NodeList or String (selector)
responsive 在窗口尺寸调整后 进行响应式的重渲染 默认true
restore 在窗口尺寸调整后 恢复被裁剪的区域 默认true
checkCrossOrigin 检查图片是否跨域 默认true 如果是 会在被复制的图片元素上加上属性crossOrigin 并且在src上加上一个时间戳 避免重加载图片时因为浏览器缓存而加载错误
checkOrientation 检查图片的方向信息(仅JPEG图片有)默认true 在旋转图片时会对图片方向值做一些处理 以解决IOS设备上的一些问题
modal 是否显示图片和裁剪框之间的黑色蒙版 默认true
guides 是否显示裁剪框的虚线 默认true
center 是否显示裁剪框中间的 ‘+’ 指示器 默认true
highlight 是否显示裁剪框上面的白色蒙版 (很淡)默认true
background 是否在容器内显示网格状的背景 默认true
autoCrop 允许初始化时自动的裁剪图片 配合 data 使用 默认true
autoCropArea 设置裁剪区域占图片的大小 值为 0-1 默认 0.8 表示 80%的区域
movable 是否可以移动图片 默认true
rotatable 是否可以旋转图片 默认true
scalable 是否可以缩放图片(可以改变长宽) 默认true
zoomable 是否可以缩放图片(改变焦距) 默认true
zoomOnTouch 是否可以通过拖拽触摸缩放图片 默认true
zoomOnWheel 是否可以通过鼠标滚轮缩放图片 默认true
wheelZoomRatio 设置鼠标滚轮缩放的灵敏度 默认 0.1
cropBoxMovable 是否可以拖拽裁剪框 默认true
cropBoxResizable 是否可以改变裁剪框的尺寸 默认true
toggleDragModeOnDblclick 是否可以通过双击切换拖拽图片模式(move和crop)默认true 当拖拽图片模式为none时不可切换 该设置必须浏览器支持双击事件
minContainerWidth(200)、minContainerHeight(100)、minCanvasWidth(0)、minCanvasHeight(0)、minCropBoxWidth(0)、minCropBoxHeight(0) 容器、图片、裁剪框的 最小宽高 括号内为默认值 注意 裁剪框的最小高宽是相对与页面而言的 并非相对图片
方法
注意:如果方法没有被设置返回任何值,那么它会返回一个cropper的实例 因此多个方法可以使用链式写法
crop() 手动显示裁剪框
reset() 重置图片和裁剪框为初始状态
replace(url[, hasSameSize]) 替换图片路径并且重建裁剪框
url 新路径
hasSameSize 默认值false 设置为true表示新老图片尺寸一样 只需要更换路径无需重建裁剪框
enable() 解冻 裁剪框
disable() 冻结 裁剪框
destroy() 摧毁裁剪框并且移除cropper实例
move(offsetX[, offsetY]) 移动图片指定距离 一个参数代表横纵向移动距离一样
moveTo(x[, y]) 移动图片到一个指定的点 一个参数代表横纵向移动距离一样
zoom(ratio) 缩放 ratio大于零是放大 小于零缩小
zoomTo(ratio[, pivot]) 缩放并设置中心点的位置
rotate(degree) 旋转 类似css
rotateTo(degree) 旋转到绝对角度
scale(scaleX[, scaleY])、scaleX(scaleX)、scaleY(scaleY) 缩放 一个参数代表横纵向缩放值一样
getData([rounded]) 返回裁剪区域基于原图片!原尺寸!的位置和尺寸 rounded默认为false 表示是否显示四舍五入后的数据 有了这些数据可以直接在原图上进行裁剪显示
setData(data) 改变裁剪区域基于原图的位置和尺寸 仅当viewMode 不为0时有效
getContainerData()、getImageData()、getCanvasData()、setCanvasData(data)、getCropBoxData()、setCropBoxData(data) 容器、图片容器(画布)、图片、裁剪区域相对容器的数据设置和获取
getCroppedCanvas([options]) 得到被裁剪图片的一个canvas对象 options设置这个canvas的一些数据
width、height、minWidth、minHeight、maxWidth、maxHeight、fillColor、imageSmoothingEnabled(图片是否是光滑的 默认true)、imageSmoothingQuality(图片的质量 默认low 还有medium、high)
setAspectRatio(aspectRatio) 改变裁剪区域的宽高比
setDragMode([mode]) 设置拖拽图片模式
事件
ready 渲染前(图片已经被加载、cropper实例已经准备完毕)的准备工作事件
cropstart、cropmove、cropend、crop 开始画裁剪框(或画布)、画裁剪框(或画布)的中途、裁剪框(或画布)画完、进行裁剪事件 event.detail.originalEvent、event.detail.action
当autoCrop为true crop事件会在ready之前触发
zoom 裁剪框缩放事件
作者:他不爱你哈
链接:https://www.jianshu.com/p/5f5aafe9e895
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。