vue 裁剪图片,插件Cropper的使用

全局安装    npm install cropperjs

如果想本项目安装,方便移植:   import Cropper from 'cropperjs'   --save    这样的话,本地 package.json  文件中 dependencies 就会引入  移植后npm install安装就会带入

接着再引入   import Cropper from 'cropperjs'    

<template>
<div id="cropper">
            <!-- 遮罩层 -->
            <div class="container" v-show="panel">
                <div><img id="image" :src="url"></div>
                <button type="button" id="button" @click="crop">确定</button>
            </div>
            <!-- 遮罩层 -->
    
            <div>
                <div class="show">
                    <div class="picture" :style="'backgroundImage:url('+headerImage+')'">
                    </div>
                </div>
                <div>
                    <input type="file" accept="image" @change="change">                    
                </div>    
            </div>
        </div>
</template>
<script>
import Cropper from 'cropperjs'  
export default {  
  components: {  
      
  },  
  data () {  
    return {  
      headerImage:'',  
      picValue:'',  
      cropper:'',  
      croppable:false,  
      panel:false,  
      url:''  
    }  
  },  
  mounted () {  
    //初始化这个裁剪框  
    var self = this;  
    var image = document.getElementById('image');  
    this.cropper = new Cropper(image, {  
      aspectRatio: 1,  
      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;  
  
    },  
    crop () {  
        this.panel = false;  
        var croppedCanvas;  
        var roundedCanvas;  
  
        if (!this.croppable) {  
          return;  
        }  
        // Crop  
        croppedCanvas = this.cropper.getCroppedCanvas();  
        console.log(this.cropper)  
        // Round  
        roundedCanvas = this.getRoundedCanvas(croppedCanvas);  
  
        this.headerImage = roundedCanvas.toDataURL();  
        this.postImg()  
          
    },  
    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 () {  
      //这边写图片的上传  
    }  
  }  
}  
</script>  
  
<style>  
*{  
  margin: 0;  
  padding: 0;  
}  
#demo #button {  
  position: absolute;  
  right: 10px;  
  top: 10px;  
   80px;  
  height: 40px;  
  border:none;  
  border-radius: 5px;  
  background:white;  
}  
#demo .show {  
   100px;  
  height: 100px;  
  overflow: hidden;  
  position: relative;  
  border-radius: 50%;  
  border: 1px solid #d5d5d5;  
}  
#demo .picture {  
   100%;  
  height: 100%;  
  overflow: hidden;  
  background-position: center center;  
  background-repeat: no-repeat;  
  background-size: cover;   
}  
#demo .container {  
    z-index: 99;  
    position: fixed;  
    padding-top: 60px;  
    left: 0;  
    top: 0;  
    right: 0;  
    bottom: 0;  
    background:rgba(0,0,0,1);  
}  
  
#demo #image {  
  max- 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- 0 !important;  
  max- none !important;  
  min-height: 0 !important;  
  max-height: none !important;  
   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;  
  background-color: #fff;  
}  
  
.cropper-modal {  
  opacity: .5;  
  background-color: #000;  
}  
  
.cropper-view-box {  
  display: block;  
  overflow: hidden;  
  
   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;  
   100%;  
  height: 33.33333%;  
  border-top- 1px;  
  border-bottom- 1px  
}  
  
.cropper-dashed.dashed-v {  
  top: 0;  
  left: 33.33333%;  
   33.33333%;  
  height: 100%;  
  border-right- 1px;  
  border-left- 1px  
}  
  
.cropper-center {  
  position: absolute;  
  top: 50%;  
  left: 50%;  
  
  display: block;  
  
   0;  
  height: 0;  
  
  opacity: .75  
}  
  
.cropper-center:before,  
  .cropper-center:after {  
  position: absolute;  
  display: block;  
  content: ' ';  
  background-color: #eee  
}  
  
.cropper-center:before {  
  top: 0;  
  left: -3px;  
   7px;  
  height: 1px  
}  
  
.cropper-center:after {  
  top: -3px;  
  left: 0;  
   1px;  
  height: 7px  
}  
  
.cropper-face,  
.cropper-line,  
.cropper-point {  
  position: absolute;  
  
  display: block;  
  
   100%;  
  height: 100%;  
  
  opacity: .1;  
}  
  
.cropper-face {  
  top: 0;  
  left: 0;  
  
  background-color: #fff;  
}  
  
.cropper-line {  
  background-color: #39f  
}  
  
.cropper-line.line-e {  
  top: 0;  
  right: -3px;  
   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;  
   5px;  
  cursor: w-resize  
}  
  
.cropper-line.line-s {  
  bottom: -3px;  
  left: 0;  
  height: 5px;  
  cursor: s-resize  
}  
  
.cropper-point {  
   5px;  
  height: 5px;  
  
  opacity: .75;  
  background-color: #39f  
}  
  
.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;  
   20px;  
  height: 20px;  
  cursor: se-resize;  
  opacity: 1  
}  
  
@media (min- 768px) {  
  
  .cropper-point.point-se {  
     15px;  
    height: 15px  
  }  
}  
  
@media (min- 992px) {  
  
  .cropper-point.point-se {  
     10px;  
    height: 10px  
  }  
}  
  
@media (min- 1200px) {  
  
  .cropper-point.point-se {  
     5px;  
    height: 5px;  
    opacity: .75  
  }  
}  
  
.cropper-point.point-se:before {  
  position: absolute;  
  right: -50%;  
  bottom: -50%;  
  display: block;  
   200%;  
  height: 200%;  
  content: ' ';  
  opacity: 0;  
  background-color: #39f  
}  
  
.cropper-invisible {  
  opacity: 0;  
}  
  
.cropper-bg {  
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');  
}  
  
.cropper-hide {  
  position: absolute;  
  
  display: block;  
  
   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>  

参考 : http://blog.csdn.net/xiaogezl/article/details/70227025

原文地址:https://www.cnblogs.com/xiangsj/p/7161435.html