一、安装使用
1.安装
# npm 安装
npm install vue-cropper
# yarn 安装
yarn add vue-cropper
2.引入 Vue Cropper
Vue2 组件内引入
import { VueCropper } from 'vue-cropper'
components: {
VueCropper
}
Vue2 全局引入
import VueCropper from 'vue-cropper'
Vue.use(VueCropper)
3.代码中使用
重要! 需要关掉本地的 mock 服务, 不然图片转化会报错 重要! 需要使用外层容器包裹并设置宽高
<vueCropper
ref="cropper"
:img="option.img"
:outputSize="option.size"
:outputType="option.outputType"
></vueCropper>
二、项目使用
与 element 一起使用
几个方法需要单独拿出来
/** base64转Blob */
MixinBase64toBlob(base64) {
const byteString = atob(base64.split(',')[1])
const mimeString = base64
.split(',')[0]
.split(':')[1]
.split(';')[0]
const ab = new ArrayBuffer(byteString.length)
const ia = new Uint8Array(ab)
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i)
}
return new Blob([ab], { type: mimeString })
}
/** 裁剪头像 */
handleCropperCrop() {
this.$refs.cropper.getCropData(async data => {
const formData = new FormData()
formData.append('file', this.MixinBase64toBlob(data))
//上传方法
this.handleUploadFace(formData)
})
},
<div class="cropper-content">
<div class="cropper" style="text-align:center">
<vueCropper
ref="cropper"
:img="option.img"
:output-size="option.size"
:output-type="option.outputType"
:info="true"
:full="option.full"
:can-move="option.canMove"
:can-move-box="option.canMoveBox"
:original="option.original"
:auto-crop="option.autoCrop"
:fixed="option.fixed"
:fixed-number="option.fixedNumber"
:center-box="option.centerBox"
:info-true="option.infoTrue"
:fixed-box="option.fixedBox"
:auto-crop-width="option.autoCropWidth"
:auto-crop-height="option.autoCropHeight"
@realTime="realTime"
/>
</div>
</div>
//data中数据
option: {
img: '', // 裁剪图片的地址
info: true, // 裁剪框的大小信息
outputSize: 1, // 裁剪生成图片的质量
outputType: 'png', // 裁剪生成图片的格式 jpeg
canScale: false, // 图片是否允许滚轮缩放
canMove: true,
autoCrop: true, // 是否默认生成截图框
autoCropWidth: 100, // 默认生成截图框宽度
autoCropHeight: 100, // 默认生成截图框高度
fixedBox: true, // 固定截图框大小 不允许改变
fixed: true, // 是否开启截图框宽高固定比例
fixedNumber: [1, 1], // 截图框的宽高比例
full: true, // 是否输出原图比例的截图
canMoveBox: true, // 截图框能否拖动
original: false, // 上传图片按照原始比例渲染
centerBox: false, // 截图框是否被限制在图片里面
infoTrue: true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
},
//style
.cropper-content {
padding: 0 40px;
.cropper {
width: auto;
height: 350px;
}
}
@realTime 实时预览事件
realTime(data) {
var previews = data
var h = 0.5
var w = 0.2
this.previewStyle1 = {
width: previews.w + "px",
height: previews.h + "px",
overflow: "hidden",
margin: "0",
zoom: h
}
this.previewStyle2 = {
width: previews.w + "px",
height: previews.h + "px",
overflow: "hidden",
margin: "0",
zoom: w
}
// 固定为 100 宽度
this.previewStyle3 = {
width: previews.w + "px",
height: previews.h + "px",
overflow: "hidden",
margin: "0",
zoom: 100 / preview.w
}
// 固定为 100 高度
this.previewStyle4 = {
width: previews.w + "px",
height: previews.h + "px",
overflow: "hidden",
margin: "0",
zoom: 100 / preview.h
}
this.previews = data
}
三、问题记录
如果图片背景透明,则vue-cropper 自动为图片填充了黑色背景
解决:
outputType设置为png
//png图片显示透明底,JPG背景都带颜色不显示透明底的
相关文章:
https://segmentfault.com/q/1010000039327449
待完善:
在 element-ui 中结合弹框组件实现
上传图片的数据相互转化