Vue实现前端裁剪(elementUI上传+vueCropper实现)

Posted pyx204

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue实现前端裁剪(elementUI上传+vueCropper实现)相关的知识,希望对你有一定的参考价值。

data中需要定义的变量

            logoUrl: \'\', // 裁剪后的图片
            // 裁剪组件是否展示
            dialogVisible: false,
            // 裁剪组件的基础配置option
            option: {
                img: \'\', // 裁剪图片的地址
                info: true, // 裁剪框的大小信息
                outputSize: 0.8, // 裁剪生成图片的质量
                outputType: \'png\', // 裁剪生成图片的格式
                canScale: false, // 图片是否允许滚轮缩放
                autoCrop: true, // 是否默认生成截图框
                autoCropWidth: 180, // 默认生成截图框宽度
                autoCropHeight: 64, // 默认生成截图框高度
                fixedBox: true, // 固定截图框大小 不允许改变
                fixed: true, // 是否开启截图框宽高固定比例
                fixedNumber: [180, 64], // 截图框的宽高比例
                full: true, // 是否输出原图比例的截图
                canMoveBox: false, // 截图框能否拖动
                original: false, // 上传图片按照原始比例渲染
                centerBox: false, // 截图框是否被限制在图片里面
                infoTrue: true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
            },     

 

 

首先放一个上传图片的图标,用elementUI组件的upload

<el-upload
    class="avatarUploader"
    :auto-upload="false"
    action=""
    :show-file-list="false"
    :on-change=\'changeUpload\'>
    <img v-if="logoUrl" :src="logoUrl" class="avatar">
    <i v-else class="el-icon-plus"></i>
</el-upload>

注意:auto-upload一定要设置成false, logoUrl代表裁剪后展示的图片,本例只可上传一张图片,如需多张自己调整

 

使用npm 安装 VueCropper,并在页面的js部分引入

import Vue from \'vue\'
import VueCropper from \'vue-cropper\'
// 裁剪图片
Vue.use(VueCropper)

html部分

 <!-- vueCropper 剪裁图片实现-->
        <el-dialog title="图片剪裁" :visible.sync="dialogVisible" append-to-body>
            <div class="cropper-content">
                <div class="cropper" style="text-align:center">
                    <vueCropper
                        ref="cropper"
                        :img="option.img"
                        :outputSize="option.outputSize"
                        :outputType="option.outputType"
                        :info="true"    
                        :full="option.full"
                        :autoCropHeight="option.autoCropHeight"
                        :autoCropWidth="option.autoCropWidth"
                        :canMove="option.canMove"
                        :canMoveBox="option.canMoveBox"
                        :original="option.original"
                        :autoCrop="option.autoCrop"
                        :fixed="option.fixed"
                        :fixedNumber="option.fixedNumber"
                        :centerBox="option.centerBox"
                        :infoTrue="option.infoTrue"
                        :fixedBox="option.fixedBox"
                    ></vueCropper>
                </div>
            </div>
            <div slot="footer" class="dialog-footer">
                <div class="rowJe">
                    <div @click="dialogVisible = false" class="cancelBtn">取 消</div>
                    <div type="primary" @click="finish" :loading="loading" class="ensureBtn">确认</div>
                </div>
                
            </div>
        </el-dialog>

使用el-upload 上传图片后弹出裁剪页面

// 上传按钮   限制图片大小
        changeUpload(file, fileList) {
            const isLt2M = file.size / 1024 / 1024 < 2
            if (!isLt2M) {
                alert(\'上传图片不能超过2M\')
                return false
            }
            this.cutImgFile = file.raw
            this.fileinfo = file
            // console.log("file",file,fileList)

            // 上传成功后将图片地址赋值给裁剪框显示图片
            this.$nextTick(() => {
                this.option.img = URL.createObjectURL(file.raw)
                this.dialogVisible = true
                // console.log("图片地址:",this.option.img)
            })
        },

裁剪完成触发的方法

// 点击裁剪,这一步是可以拿到处理后的地址
        finish() {
            this.$refs.cropper.getCropBlob((data) => {
                // data 是裁剪后的文件数据,需转成后端需要的格式请求上传接口
                const file = new window.File([data],this.cutImgFile.name)
                var formData = new FormData();
                formData.append("file", file);
                // uplodeImgInstitution 封装的后端接口,
                uplodeImgInstitution(formData).then((res) => {
                    if (res.resultCode == 200) {
                        console.log("图片上传成功:",res)
                        this.logoUrl = res.data
                        this.dialogVisible = false
                        this.editInfo()
                    } else {
                        alert(\'上传图片失败\')
                    }
                });
            })
        }

 

以上是关于Vue实现前端裁剪(elementUI上传+vueCropper实现)的主要内容,如果未能解决你的问题,请参考以下文章

VUE 前端大文件上传如何实现?

vue点击上传图片,vue上传oss,vue-cropper图片裁剪功能

Vue+ElementUI实现图片上传

vue + elementui upload上传图片到服务器以及保存后回显问题

vue+elementUi结合vue-cropper插件,开发一个能裁剪图片功能组件

vue+elementUi结合vue-cropper插件,开发一个能裁剪图片功能组件