<template> 
 | 
  <div class="iconShot"> 
 | 
    <div class="icon-dialog"> 
 | 
      <div class="clip"> 
 | 
        <div class="img" ref="img"> 
 | 
          <vue-cropper 
 | 
              ref="cropper" 
 | 
              :img="imgSrc" 
 | 
              :width="options.width" 
 | 
              :height="options.height" 
 | 
              :canScale="options.canScale" 
 | 
              :autoCrop="options.autoCrop" 
 | 
              :canMove="options.canMove" 
 | 
              :output-size="options.outputSize" 
 | 
              :centerBox="options.centerBox" 
 | 
              :autoCropWidth="options.autoCropWidth" 
 | 
              :autoCropHeight="options.autoCropHeight" 
 | 
              @realTime="realTime" 
 | 
          ></vue-cropper> 
 | 
        </div> 
 | 
        <div class="previews"> 
 | 
          <img style="width: 150px;height: 150px;border-radius1: 50%;object-fit: cover" :src="cutImgSrc" alt="图片"> 
 | 
        </div> 
 | 
      </div> 
 | 
    </div> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
import { VueCropper } from 'vue-cropper' 
 | 
import {upload} from "@/api/system/common"; 
 | 
export default { 
 | 
  name: 'ImageCropper', 
 | 
  components: { VueCropper }, 
 | 
  props: { 
 | 
    imgSrc: { 
 | 
      type: String, 
 | 
      default: '' 
 | 
    }, 
 | 
    // 回显上次保存的截图的位置 
 | 
    location: { 
 | 
      type: Object, 
 | 
      default () { 
 | 
        return {} 
 | 
      } 
 | 
    } 
 | 
    // iconItem:{ 
 | 
    //   type:Object, 
 | 
    //   default(){ 
 | 
    //     return {}; 
 | 
    //   } 
 | 
    // } 
 | 
  }, 
 | 
  data () { 
 | 
    return { 
 | 
      // 学习截图选项 
 | 
      iconForm: { 
 | 
        originImgBase64: '', 
 | 
        imgBase64: '' 
 | 
        // location: "", 
 | 
        // matchingName: "", 
 | 
        // matchingType: "", 
 | 
        // note: "", 
 | 
        // picGroupId: "0", 
 | 
        // tsId: "", 
 | 
      }, 
 | 
      // 储存截图区域的图片,自己传 
 | 
      // imgSrc:'', 
 | 
      // 储存截图后的生成的base64图片 
 | 
      cutImgSrc: '', 
 | 
      // cropper插件的配置 
 | 
      options: { 
 | 
        canScale: false, 
 | 
        autoCrop: true, 
 | 
        canMove: false, 
 | 
        centerBox: true, 
 | 
        height: 500, 
 | 
        width: 500, 
 | 
        outputSize:{width: 500, height: 500 }, 
 | 
        autoCropWidth: 500, 
 | 
        autoCropHeight: 500, 
 | 
        fixed: true, 
 | 
        fixedNumber: [1, 1] 
 | 
      }, 
 | 
      // 截图框相对图片的位置 
 | 
      clipAxis: {}, 
 | 
      // 截图回显标志,只触发一次实现回显, 
 | 
      flag: true 
 | 
    } 
 | 
  }, 
 | 
  mounted () { 
 | 
  
 | 
  }, 
 | 
  watch: { 
 | 
  }, 
 | 
  methods: { 
 | 
    getImagecropper(){ 
 | 
      return this.$refs.cropper 
 | 
    }, 
 | 
    // 学习截图框变化事件 
 | 
    realTime (data) { 
 | 
      if (data.h) { 
 | 
        // 获取图片相对容器的位置 
 | 
        const img = this.$refs.cropper.getImgAxis() 
 | 
        // 获取截图框相对容器的位置 
 | 
        const clip = this.$refs.cropper.getCropAxis() 
 | 
        this.clipAxis.x = clip.x1 - img.x1 
 | 
        this.clipAxis.y = clip.y1 - img.y1 
 | 
        // 获取截图图片 
 | 
        this.$refs.cropper.getCropData(img => { 
 | 
          this.clipAxis.width = data.w 
 | 
          this.clipAxis.height = data.h 
 | 
          this.cutImgSrc = img 
 | 
        }) 
 | 
        // 获取原图base64的图片 
 | 
        // this.imageUrlToBase64(data.url); 
 | 
  
 | 
        // 图标列表编辑回显(初始化只触发一次) 
 | 
        if (this.location.height != undefined && this.flag) { 
 | 
          this.$nextTick(() => { 
 | 
            // auto crop 
 | 
            this.$refs.cropper.goAutoCrop() 
 | 
            this.$nextTick(() => { 
 | 
              // if cropped and has position message, update crop box 
 | 
              this.$refs.cropper.cropOffsertX = this.location.x + img.x1 
 | 
              this.$refs.cropper.cropOffsertY = this.location.y + img.y1 
 | 
              this.$refs.cropper.cropW = this.location.width 
 | 
              this.$refs.cropper.cropH = this.location.height 
 | 
  
 | 
              // this.iconForm.location=this.iconItem.location; 
 | 
              // this.iconForm.matchingName=this.iconItem.matchingName; 
 | 
              // this.iconForm.matchingType=this.iconItem.matchingType; 
 | 
              // this.iconForm.note=this.iconItem.note; 
 | 
              // this.picGroupId=this.iconItem.picGroupId.split(','); 
 | 
              // this.iconForm.id=this.iconItem.id; 
 | 
              // this.iconForm.tsId=this.iconItem.tsId; 
 | 
              this.flag = false 
 | 
            }) 
 | 
          }) 
 | 
        } 
 | 
      } 
 | 
    }, 
 | 
    // 原图通过canvas转为base64的格式 
 | 
    imageUrlToBase64 (src) { 
 | 
      // 一定要设置为let,不然图片不显示 
 | 
      const image = new Image() 
 | 
      // 解决跨域问题 
 | 
      image.setAttribute('crossOrigin', 'anonymous') 
 | 
      const imageUrl = src 
 | 
      image.src = imageUrl 
 | 
  
 | 
      // image.onload为异步加载 
 | 
      image.onload = () => { 
 | 
        var canvas = document.createElement('canvas') 
 | 
        canvas.width = image.width 
 | 
        canvas.height = image.height 
 | 
        var context = canvas.getContext('2d') 
 | 
        context.drawImage(image, 0, 0, image.width, image.height) 
 | 
  
 | 
        // var quality = 0.8; 
 | 
        // 这里的dataurl就是base64类型 
 | 
        const dataURL = canvas.toDataURL('image/jpeg')// 使用toDataUrl将图片转换成jpeg的格式 
 | 
        this.iconForm.originImgBase64 = dataURL 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
.iconShot { 
 | 
  .icon-dialog { 
 | 
    .clip { 
 | 
      display: flex; 
 | 
      .img { 
 | 
        flex: 7.5; 
 | 
        height: 500px; 
 | 
        //float: left; 
 | 
        // display: inline-block; 
 | 
        .vue-cropper { 
 | 
          background-image: none; 
 | 
        } 
 | 
        .cropper-move { 
 | 
          cursor: default; 
 | 
        } 
 | 
        .cropper-face.cropper-move { 
 | 
          cursor: move; 
 | 
        } 
 | 
  
 | 
      } 
 | 
      .previews { 
 | 
        //width: 100px; 
 | 
        flex: 2.5; 
 | 
        //float: right; 
 | 
        height: 200px; 
 | 
        //position: relative; 
 | 
        >img { 
 | 
          //position: absolute; 
 | 
          //left: 50%; 
 | 
          transform: translate(35%, 50px); 
 | 
          max-height: 100%; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  
 | 
  } 
 | 
  .icon-options { 
 | 
    font-size: 12px; 
 | 
    font-weight: 200; 
 | 
    >.el-row { 
 | 
      >.el-col { 
 | 
        >.el-row { 
 | 
          height: 36px; 
 | 
          line-height: 36px; 
 | 
          >.el-col:nth-child(1) { 
 | 
            font-weight: 600; 
 | 
            text-align: right; 
 | 
          } 
 | 
          .el-col:nth-child(2) { 
 | 
            .el-input,.el-select { 
 | 
              width: 185px !important; 
 | 
            } 
 | 
          } 
 | 
          >.el-col { 
 | 
            padding: 0 10px; 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</style> 
 |