vue 头像修改-裁剪图片 vue-cropper

简介: vue 头像修改-裁剪图片 vue-cropper

安装插件 vue-cropper

cnpm i vue-cropper --save

页面中引用插件

import {VueCropper} from 'vue-cropper'
components: {VueCropper},

原头像

<div style="text-align: center">
    <img style="border-radius: 50%" width="120px" :src="avatarURL" >
    <el-button type="text" @click="editAvatar">修改头像</el-button>
</div>

点击“修改头像”按钮,弹出修改头像弹窗

editAvatar() {
    this.editAvatarDialog = true
    this.option.img = this.avatarURL
},

修改头像弹窗

<el-dialog title="修改头像" :visible.sync="editAvatarDialog" width="40%">
    <el-row type="flex" justify="center">
        <div class="cropper">
            <vueCropper
                    ref="cropper"
                    :img="option.img"
                    :outputSize="option.size"
                    :outputType="option.outputType"
                    :info="option.info"
                    :full="option.full"
                    :canMove="option.canMove"
                    :canMoveBox="option.canMoveBox"
                    :original="option.original"
                    :autoCrop="option.autoCrop"
                    :autoCropWidth="option.autoCropWidth"
                    :autoCropHeight="option.autoCropHeight"
                    :fixedBox="option.fixedBox"
                    @realTime="realTime"
            ></vueCropper>
        </div>
        <div class="previewBox">
            <div :style="previews.div" class="preview">
                <img :src="previews.url" :style="previews.img">
            </div>
            <el-row type="flex" justify="center">
                <el-upload
                        action=""
                        :show-file-list="false"
                        :auto-upload="false"
                        :on-change="uploadImg"
                >
                    <el-button size="mini" type="primary"
                    > 更换头像
                    </el-button>
                </el-upload>
            </el-row>
            <br>
            <el-row>
                <el-button icon="el-icon-plus" circle size="mini"
                           @click="changeScale(1)"></el-button>
                <el-button icon="el-icon-minus" circle size="mini"
                           @click="changeScale(-1)"></el-button>
                <el-button icon="el-icon-download" circle size="mini"
                           @click="down('blob')"></el-button>
                <el-button icon="el-icon-refresh-left" circle size="mini"
                           @click="rotateLeft"></el-button>
                <el-button icon="el-icon-refresh-right" circle size="mini"
                           @click="rotateRight"></el-button>
            </el-row>
        </div>
    </el-row>
    <span slot="footer" class="dialog-footer">
        <el-button @click="editAvatarDialog = false">取 消</el-button>
        <el-button type="primary" @click="saveEditAvatar">确 定</el-button>
    </span>
</el-dialog>

相关变量

avatarURL: require("@/assets/images/头像.jpg"),
editAvatarDialog: false,
previews: {},
option: {
    img: '', // 裁剪图片的地址
    info: true, // 裁剪框的大小信息
    outputSize: 1, // 剪切后的图片质量(0.1-1)
    full: true, // 输出原图比例截图 props名full
    outputType: 'png', // 裁剪生成额图片的格式
    canMove: true,  // 能否拖动图片
    original: false,  // 上传图片是否显示原始宽高
    canMoveBox: true,  // 能否拖动截图框
    autoCrop: true, // 是否默认生成截图框
    autoCropWidth: 150,
    autoCropHeight: 150,
    fixedBox: true // 截图框固定大小
},

相关方法

// 保存头像修改
saveEditAvatar() {
    this.editAvatarDialog = false
    this.finish('blob')
},
// 放大/缩小
changeScale(num) {
    num = num || 1;
    this.$refs.cropper.changeScale(num);
},
// 左旋转
rotateLeft() {
    this.$refs.cropper.rotateLeft();
},
// 右旋转
rotateRight() {
    this.$refs.cropper.rotateRight();
},
// 保存上传图片
finish(type) {
    if (type === 'blob') {
        this.$refs.cropper.getCropBlob((data) => {
            this.avatarURL = window.URL.createObjectURL(data)
            //访问接口保存到数据库写这儿!
        })
    } else {
        this.$refs.cropper.getCropData((data) => {
            //访问接口保存到数据库写这儿!
        })
    }
},
// 实时预览函数
realTime(data) {
    this.previews = data
},
// 下载图片
down(type) {
    var aLink = document.createElement('a')
    aLink.download = 'author-img'
    if (type === 'blob') {
        this.$refs.cropper.getCropBlob((data) => {
            aLink.href = window.URL.createObjectURL(data)
            aLink.click()
        })
    } else {
        this.$refs.cropper.getCropData((data) => {
            aLink.href = data;
            aLink.click()
        })
    }
},
// 更换头像--上传本地图片
uploadImg(file) {
    var _this = this;
    var reader = new FileReader();
    reader.onload = (e) => {
        let data;
        if (typeof e.target.result === 'object') {
            // 把Array Buffer转化为blob 如果是base64不需要
            data = window.URL.createObjectURL(new Blob([e.target.result]))
        } else {
            data = e.target.result
        }
        _this.option.img = data
    }
    // 转化为base64
    // reader.readAsDataURL(file.raw)
    // 转化为blob
    reader.readAsArrayBuffer(file.raw);
},

相关样式(必要)

    .previewBox {
        text-align: center;
        margin-left: 60px;
    }
 
    .preview {
        width: 150px;
        height: 150px;
        margin: 0px auto 20px auto;
        border-radius: 50%;
        border: 1px solid #ccc;
        background-color: #ccc;
        overflow: hidden;
    }
 
    .cropper {
        width: 260px;
        height: 260px;
    }


目录
相关文章
|
29天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
5天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
29天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
27 1
|
29天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
29天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
1月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
37 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
29 1
|
1月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
37 1
vue学习第四章
|
1月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
25 1
vue学习第7章(循环)