zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [算法整理]树上求LCA算法合集
    线段树专题测试2017.1.21
    [数据结构]替罪羊树简介
    图论测试 2017.1.17
    bzoj 2038 A-小Z的袜子[hose]
    洛谷比赛『期末考后的休闲比赛2』
    [题解]bzoj 1861 Book 书架
    bzoj 3223 文艺平衡树
    Splay简介
    python2.7 一个莫名其妙的错误
  • 原文地址:https://www.cnblogs.com/xiangsj/p/7161435.html
Copyright © 2011-2022 走看看