vue-cropper手机版压缩上传图片

1、安装

npm install vue-cropper

2、使用

在main.js文件中引入和使用

import VueCropper from 'vue-cropper'

Vue.use(VueCropper)

3、上传函数的触发,‘<el-upload>标签为element的标签,如果不知道请直接了解https://element.eleme.cn/#/zh-CN/component/upload

<el-upload id="uploadClick" action="" name="file" :beforeUpload="beforeUpload">

  <div class="el_upload_l flex_justify_center flex_align_center" v-if="uploadImgShow">

    <div>+

  <div style="height: 10.5rem;width: 7.5rem;" v-else>

    <img class="height_100 width_100" :src="uploadImg"/>

</el-upload>

4、弹出图片裁剪的组件‘<el-dialog>标签为element的对话框组件https://element.eleme.cn/#/zh-CN/component/dialog

<el-dialog title="图片剪裁" :visible.sync="dialogVisible" append-to-body fullscreen>

  <div class="cropper-content">

    <div class="cropper" style="text-align:center">

        ref="cropper"

        :img="option.img"

        :outputSize="option.size"

        :outputType="option.outputType"

        :info="true"

        :full="option.full"

        :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"

      >

  <div slot="footer" class="dialog-footer">

    <el-button @click="dialogVisible= false">取 消

    <el-button type="primary" @click="finish" :loading="loading">确认

</el-dialog>

5、css样式*‘以下样式一定要写,不然会显示不出截图的背景最终显示为NAN’*

.cropper-content .cropper {

 width:auto;

  height:300px;

}

6、组件内data的数据配置

data(){

return{

    uploadImgShow:true,//控制显示上传了的图片还是未上传的+号

    uploadImg:null,//上传后接口返回的图片链接

    dialogVisible:false,//图片截图的对话框是否显示控制

    option: {

         img:'', // 裁剪图片的地址

          info:true, // 裁剪框的大小信息

          outputSize:0.8, // 裁剪生成图片的质量

          outputType:'jpeg', // 裁剪生成图片的格式

          canScale:false, // 图片是否允许滚轮缩放

          autoCrop:true, // 是否默认生成截图框

          fixedBox:true, // 固定截图框大小 不允许改变

          fixed:true, // 是否开启截图框宽高固定比例

          fixedNumber: [5, 7], // 截图框的宽高比例

          full:true, // 是否输出原图比例的截图

          canMoveBox:false, // 截图框能否拖动

          original:false, // 上传图片按照原始比例渲染

          centerBox:false, // 截图框是否被限制在图片里面

          infoTrue:true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高

        },

        // 防止重复提交

        loading:false,

    }

}

7、封装压缩和base64转成bolb对象的函数再public.js文件中

// 压缩图片

export function compress(img) {

        let canvas = document.createElement("canvas"),

         ctx = canvas.getContext("2d"),

          initSize = img.src.length;

          let width = img.width

          let height = img.height;

          canvas.width = width

          canvas.height = height

        // 铺底色

           ctx.fillStyle ="#fff"

           ctx.fillRect(0, 0, canvas.width, canvas.height)

           ctx.drawImage(img, 0, 0, width, height)

           //进行压缩

           let ndata = canvas.toDataURL("image/jpeg", 0.5)

           //console.log("压缩后的图片大小:" + ndata.length)

            return ndata

}

// base64转成bolb对象

export function dataURItoBlob(base64Data) {

           let byteString

           if (base64Data.split(",")[0].indexOf("base64") >=0)

           byteString =atob(base64Data.split(",")[1])

           else

            byteString =unescape(base64Data.split(",")[1])

           let mimeString = base64Data .split(",")[0] .split(":")[1] .split(";")[0];

           let ia =new Uint8Array(byteString.length);

           for (let i =0; i < byteString.length; i++) {

           ia[i] = byteString.charCodeAt(i);

  }

        return new Blob([ia], {type: mimeString })

}

8、在组件中引入上面两个封装函数

import {compress,dataURItoBlob}from '@/assets/js/public.js';

import axios  from 'axios';

9、函数的封装

//上传图片

beforeUpload(file){

        const reader =new FileReader()

        this.fileinfo = file;

        reader.readAsDataURL(file)

        reader.onload = () => {

            this.option.img = reader.result;

             this.dialogVisible =true

          }

        return false

},

//点击图片上传函数

finish() {

        this.$refs.cropper.getCropData((data) => {

            const that =this

            let img =new Image()

            img.src = data

            img.onload =function() {

                let _data = compress(img);

                let blob = dataURItoBlob(_data)

                let formData =new FormData()

                formData.append('file', blob, Math.floor(Math.random() *1000000000000))

                this.loading =true

                axios.post('/*上传的图片服务器路径*/', formData, {contentType:false, processData:false, headers: {'Content-Type':'application/x-www-form-urlencoded' } }).then((res) => {

                 that.loading =false;

                  that.uploadImgShow =false;

                  that.dialogVisible =false;

                  that.uploadImg = res.data.qiniuUrl;

                  that.$toast.success({message:'上传成功!', duration:1000});

                })

        }

    })

},

10、效果显示



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

推荐阅读更多精彩内容