vue上传头像前剪裁

本文介绍了在Vue项目中使用cropperjs进行图片上传前的剪裁操作,虽然该插件在iOS微信浏览器中可能出现图片失真的问题,但通过切换到vue-cropper插件,成功解决了这一问题,提供了更完善的解决方案。
摘要由CSDN通过智能技术生成

vue上传头像前剪裁

安装cropperjs :
npm install cropperjs --save-dev

代码如下:

<template>
    <div id="cutimg">
      <!-- 遮罩层 -->
      <div class="container" v-show="panel">
        <div>
          <img id="image" :src="url" alt="Picture">
        </div>
        <button type="button" id="button" @click="sureimg">确定</button>
      </div>

      <div class="upload_wrap">
        <div class="show">
          <div class="picture" :style="'backgroundImage:url('+headerImage+')'">
          </div>
        </div>
        <div style="margin-top:20px;">
          <input type="file" id="change" accept="image" @change="change">
        </div>
      </div>

    </div>
</template>
 
<script>
  import Cropper from 'cropperjs';
  import { Indicator } from 'mint-ui';
import { setTimeout } from 'timers';
  export default {
    components: {
 
    },
    data () {
      return {
        headerImage:require('../assets/img/upload1.jpg'),
        picValue:'',
        cropper:'',
        croppable:false,
        panel:false,
        url:''
      }
    },
    mounted () {
      //初始化这个裁剪框
      var self = this;
      var image = document.getElementById('image');
      this.cropper = new Cropper(image, {
        aspectRatio: 5/7,
        viewMode: 1,
        background:false,
        zoomable:false,
        ready: function () {
          self.croppable = true;
        }
      });
    },
    methods: {
      getObjectURL (file) {
        var url = null ;
        if (window.createObjectURL!=undefined) { // basic
          url = window.createObjectURL(file) ;
        } else if (window.URL!=undefined) { // mozilla(firefox)
          url = window.URL.createObjectURL(file) ;
        } else if (window.webkitURL!=undefined) { // webkit or chrome
          url = window.webkitURL.createObjectURL(file) ;
        }
        return url ;
      },
      change (e) {
        let files = e.target.files || e.dataTransfer.files;
        if (!files.length) return;
        this.panel = true;
        this.picValue = files[0];
 
        this.url = this.getObjectURL(this.picValue);
        //每次替换图片要重新得到新的url
        if(this.cropper){
          this.cropper.replace(this.url);
        }
        this.panel = true;
      },
      sureimg () {
        var self=this;
        Indicator.open('剪裁中...');
        this.panel = false;
        var croppedCanvas;
        var roundedCanvas;
        if (!this.croppable) {
          return;
        }
        setTimeout(function(){
          croppedCanvas = self.cropper.getCroppedCanvas();
        // Round
          roundedCanvas = self.getRoundedCanvas(croppedCanvas);
          self.headerImage = roundedCanvas.toDataURL();
          self.postImg();
        },100)
        // Crop
        
      },
      getRoundedCanvas (sourceCanvas) {
        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        var width = sourceCanvas.width;
        var height = sourceCanvas.height;
        canvas.width = width;
        canvas.height = height;
        context.imageSmoothingEnabled = true;
        context.drawImage(sourceCanvas, 0, 0, width, height);
        context.globalCompositeOperation = 'destination-in';
        //画圆
        // context.beginPath();
        // context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true);
        // context.fill();
        return canvas;
      },
      postImg () {
        //这边写图片的上传
        Indicator.close();
        this.$emit('imgfile', this.headerImage);
        
      }
    }
  }
</script>
 
<style>
  *{
    margin: 0;
    padding: 0;
  }
  .mint-indicator{
    position:absolute;
    z-index:9999999999999999999999999;
  }
  .mint-indicator-wrapper{
    z-index:9999999999999999999999999;
  }
  .mint-indicator-mask{
    z-index:9999999999999999999999999;
  }
  #cutimg #button {
    position: absolute;
    right: 10px;
    top: 10px;
    width: 80px;
    height: 40px;
    border:none;
    border-radius: 5px;
    background:white;
  }
  #cutimg .upload_wrap{
    position:relative;
  }
  #cutimg .show {
    width: 100%;
    height:210px;
    overflow: hidden;
    position: relative;
    border: 1px solid #d5d5d5;
  }
  #cutimg .picture {
    width: 100%;
    height: 100%;
    overflow: hidden;
    background-position: center center;
    background-repeat: no-repeat;
    background-size: contain;
  }
  #cutimg .container {
    z-index: 99;
    position: fixed;
    padding-top: 60px;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    background:rgba(0,0,0,1);
  }
 .input_item input[type=file] {
    border: 1px solid#333;
    min-height: 53px;
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0px;
    top: 0px;
    z-index: 10;
    opacity: 0;
}
  #cutimg #image {
    max-width: 100%;
  }
 
  .cropper-view-box,.cropper-face {
    border-radius: 50%;
  }
  /*!
   * Cropper.js v1.0.0-rc
   * https://github.com/fengyuanchen/cropperjs
   *
   * Copyright (c) 2017 Fengyuan Chen
   * Released under the MIT license
   *
   * Date: 2017-03-25T12:02:21.062Z
   */
 
  .cropper-container {
    font-size: 0;
    line-height: 0;
    position: relative;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    direction: ltr;
    -ms-touch-action: none;
    touch-action: none
  }
 
  .cropper-container img {
    /* Avoid margin top issue (Occur only when margin-top <= -height) */
    display: block;
    min-width: 0 !important;
    max-width: none !important;
    min-height: 0 !important;
    max-height: none !important;
    width: 100%;
    height: 100%;
    image-orientation: 0deg
  }
 
  .cropper-wrap-box,
  .cropper-canvas,
  .cropper-drag-box,
  .cropper-crop-box,
  .cropper-modal {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  }
 
  .cropper-wrap-box {
    overflow: hidden;
  }
 
  .cropper-drag-box {
    opacity: 0;
  }
 
  .cropper-modal {
    opacity: .5;
  }
 
  .cropper-view-box {
    display: block;
    overflow: hidden;
    width: 100%;
    height: 100%;
    outline: 1px solid #39f;
    outline-color: rgba(51, 153, 255, 0.75);
  }
 
  .cropper-dashed {
    position: absolute;
    display: block;
    opacity: .5;
    border: 0 dashed #eee
  }
 
  .cropper-dashed.dashed-h {
    top: 33.33333%;
    left: 0;
    width: 100%;
    height: 33.33333%;
    border-top-width: 1px;
    border-bottom-width: 1px
  }
 
  .cropper-dashed.dashed-v {
    top: 0;
    left: 33.33333%;
    width: 33.33333%;
    height: 100%;
    border-right-width: 1px;
    border-left-width: 1px
  }
 
  .cropper-center {
    position: absolute;
    top: 50%;
    left: 50%;
 
    display: block;
 
    width: 0;
    height: 0;
 
    opacity: .75
  }
 
  .cropper-center:before,
  .cropper-center:after {
    position: absolute;
    display: block;
    content: ' ';
  }
 
  .cropper-center:before {
    top: 0;
    left: -3px;
    width: 7px;
    height: 1px
  }
 
  .cropper-center:after {
    top: -3px;
    left: 0;
    width: 1px;
    height: 7px
  }
 
  .cropper-face,
  .cropper-line,
  .cropper-point {
    position: absolute;
 
    display: block;
 
    width: 100%;
    height: 100%;
 
    opacity: .1;
  }
 
  .cropper-face {
    top: 0;
    left: 0;

  }
 

 
  .cropper-line.line-e {
    top: 0;
    right: -3px;
    width: 5px;
    cursor: e-resize
  }
 
  .cropper-line.line-n {
    top: -3px;
    left: 0;
    height: 5px;
    cursor: n-resize
  }
 
  .cropper-line.line-w {
    top: 0;
    left: -3px;
    width: 5px;
    cursor: w-resize
  }
 
  .cropper-line.line-s {
    bottom: -3px;
    left: 0;
    height: 5px;
    cursor: s-resize
  }
 
  .cropper-point {
    width: 5px;
    height: 5px;
 
    opacity: .75;
  }
 
  .cropper-point.point-e {
    top: 50%;
    right: -3px;
    margin-top: -3px;
    cursor: e-resize
  }
 
  .cropper-point.point-n {
    top: -3px;
    left: 50%;
    margin-left: -3px;
    cursor: n-resize
  }
 
  .cropper-point.point-w {
    top: 50%;
    left: -3px;
    margin-top: -3px;
    cursor: w-resize
  }
 
  .cropper-point.point-s {
    bottom: -3px;
    left: 50%;
    margin-left: -3px;
    cursor: s-resize
  }
 
  .cropper-point.point-ne {
    top: -3px;
    right: -3px;
    cursor: ne-resize
  }
 
  .cropper-point.point-nw {
    top: -3px;
    left: -3px;
    cursor: nw-resize
  }
 
  .cropper-point.point-sw {
    bottom: -3px;
    left: -3px;
    cursor: sw-resize
  }
 
  .cropper-point.point-se {
    right: -3px;
    bottom: -3px;
    width: 20px;
    height: 20px;
    cursor: se-resize;
    opacity: 1
  }
 
  @media (min-width: 768px) {
 
    .cropper-point.point-se {
      width: 15px;
      height: 15px
    }
  }
 
  @media (min-width: 992px) {
 
    .cropper-point.point-se {
      width: 10px;
      height: 10px
    }
  }
 
  @media (min-width: 1200px) {
 
    .cropper-point.point-se {
      width: 5px;
      height: 5px;
      opacity: .75
    }
  }
 
  .cropper-point.point-se:before {
    position: absolute;
    right: -50%;
    bottom: -50%;
    display: block;
    width: 200%;
    height: 200%;
    content: ' ';
    opacity: 0;
  }
 
  .cropper-invisible {
    opacity: 0;
  }
 
  .cropper-bg {
    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMzTjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');
  }
 
  .cropper-hide {
    position: absolute;
 
    display: block;
 
    width: 0;
    height: 0;
  }
 
  .cropper-hidden {
    display: none !important;
  }
 
  .cropper-move {
    cursor: move;
  }
 
  .cropper-crop {
    cursor: crosshair;
  }
 
  .cropper-disabled .cropper-drag-box,
  .cropper-disabled .cropper-face,
  .cropper-disabled .cropper-line,
  .cropper-disabled .cropper-point {
    cursor: not-allowed;
  }
 
 
</style>

此插件还是挺好用的,但是在ios微信浏览器上部分图片出现了图片失真问题,所以后来改用vue-cropper完美解决!
附上链接:https://github.com/xyxiao001/vue-cropper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值