Vue头像的图片剪切和上传

效果图:


首先全局安装依赖 npm install --s vue-cropper

代码如下:

<template>

    <div class="font-size-15-pk">

        <div class="cropper-content">

            <div class="cropper">

                <vueCropper

                        ref="cropper"

                        :img="option.img"

                        :outputSize="option.size"

                        :outputType="option.outputType"

                        :info="false"

                        :fixed="true"

                        :fixedNumber="[1,1]"

                        :full="option.full"

                        :centerBox="true"

                        :canMove="option.canMove"

                        :canMoveBox="option.canMoveBox"

                        :original="option.original"

                        :autoCrop="option.autoCrop"

                        :fixedBox="option.fixedBox"

                        :autoCropWidth="option.autoCropWidth"

                        :autoCropHeight="option.autoCropHeight"

                        @realTime="realTime"

                ></vueCropper>

            </div>

        </div>

        <div class="bottom-button">

            <div class="selectImg">

                <span class="text">选择图片</span>

                <input

                    type="file"

                    class="uploads"

                    accept="image/*"

                    @change="uploadImg($event)">

            </div>

            <div class="uploading" @click="down()">下载图片</div>

            <div class="uploading" @click="finish()">上传头像</div>

        </div>

    </div>

</template>

<script>

    import { VueCropper } from "vue-cropper";

    export default {

        name:'testHeadImg',

        components: {

            vueCropper: VueCropper

        },

        data() {

            return {

                headImg: "",

                //剪切图片上传

                crap: false,

                previews: {},

                option: {

                    img: "",

                    outputSize: 1, //剪切后的图片质量(0.1-1)

                    full: false, //输出原图比例截图 props名full

                    outputType: "png",

                    canMove: true,

                    original: false,

                    canMoveBox: false,

                    autoCrop: true,

                    fixedBox: true,

                    autoCropWidth: 200,

                    autoCropHeight: 150,

                },

                fileName: "", //本机文件地址

                imgFile:{},

                downImg: "#",

                uploadImgRelaPath: "" //上传后的图片的地址(不带服务器域名)

            };

        },

        methods: {

            //上传图片(点击上传按钮)

            finish() {

                let formData = new FormData();

                // 输出

                this.$refs.cropper.getCropBlob(data => {

                    let img = window.URL.createObjectURL(data);

                    console.log(img);

                    //下面这两个都可以

                    //formData.append("file", data, img);

                    formData.append("file", data, this.fileName);

                    this.$api.image(formData).then(res => {

                        let imgUrl=this.$resData(res);

                        if(imgUrl){

                            this.$api.modHeadPortrait({

                                headPortrait:imgUrl

                            }).then(res=>{

                                if(res.status===200){

                                    // this.getUserInfo();

                                    this.$toast({

                                        message:"修改头像成功"

                                    })

                                }else{

                                    this.$toast({

                                        message:"修改头像失败"

                                    })

                                }

                            })

                        }else{

                            this.$toast({

                                message:"网络请求失败"

                            })

                        }

                    });

                });

            },

            // 实时预览函数

            realTime(data) {

                console.log(data);

                this.previews = data;

            },

            //下载图片

            down() {

                let aLink = document.createElement("a");

                aLink.download = "author-img";

                this.$refs.cropper.getCropBlob(data => {

                    this.downImg = window.URL.createObjectURL(data);

                    aLink.href = window.URL.createObjectURL(data);

                    aLink.click();

                });

            },

            //选择本地图片

            uploadImg(event) {

                let imgFile={};

                let _this = this;

                //上传图片

                let file = event.target.files[0];

                imgFile =file;

                _this.imgFile=imgFile;

                _this.fileName = file.name;

                if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(event.target.value)) {

                    alert("图片类型必须是.gif,jpeg,jpg,png,bmp中的一种");

                    return false;

                }

                let 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;

                    event.target.value = ''; //避免每次选择同样的文件时,input @change 方法不执行问题

                };

                // 转化为base64

                // reader.readAsDataURL(file)

                // 转化为blob

                reader.readAsArrayBuffer(file);

            }

        }

    };

</script>

<style lang="scss">

    // 底部按钮建

    .bottom-button {

        position: fixed;

        bottom: 0;

        width: 100%;

        height: 4rem;

        display: flex;

        align-items: center;

        justify-content: space-between;

        padding: 0 1rem;

        box-sizing: border-box;

        text-align: center;

        .uploading {

            padding: 10px;

            // line-height: 2rem;

            background: #40ce53;

            color: white;

            border-radius: 4px;

            font-size: 15px;

        }

        .selectImg {

            width: 80px;

            height: 20px;

            line-height: 20px;

            padding: 10px;

            color: white;

            font-size: 15px;

            background: #65a2e7;

            border-radius: 4px;

            position: relative;

        }

        .text{

            position: absolute;

            z-index: 5;

            left: 15px;

        }

        .uploads {

            opacity: 0;

            position: absolute;

            z-index: 99;

            width: 100%;

            height: 100%;

            cursor: pointer;

        }

    }

    //改变背景色

    .cropper-box {

        background: #333 !important;

    }

    //使截图框变为圆形

    .cropper-crop-box {

        width: 200px !important;

        height: 200px !important;

        overflow: hidden;

        border-radius: 50% !important;

    }

    //截图相关样式

    .cropper-content {

        display: flex;

        display: -webkit-flex;

        justify-content: flex-end;

        -webkit-justify-content: flex-end;

        .cropper {

            width: 100%;

            height: 100%;

            position: absolute;

        }

        .show-preview {

            flex: 1;

            -webkit-flex: 1;

            display: flex;

            display: -webkit-flex;

            justify-content: center;

            -webkit-justify-content: center;

            .preview {

                overflow: hidden;

                border-radius: 50%;

                border: 1px solid #cccccc;

                background: #cccccc;

                margin-left: 40px;

            }

        }

    }

</style>

更完善的查看,有旋转、放大预览、裁剪、上传功能:https://www.jianshu.com/p/eab3a2f512bf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335