一、安装使用
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 服务, 不然图片转化会报错 重要! 需要使用外层容器包裹并设置宽高
<vueCropperref="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"><vueCropperref="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', // 裁剪生成图片的格式 jpegcanScale: 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 = datavar h = 0.5var w = 0.2this.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 中结合弹框组件实现
上传图片的数据相互转化
