index.vue 1.66 KB
<template>
  <PageWrapper title="图片裁剪示例" contentBackground>
    <div class="container">
      <div class="cropper-container">
        <CropperImage
          ref="refCropper"
          src="https://fengyuanchen.github.io/cropperjs/images/picture.jpg"
          @cropperedInfo="cropperedInfo"
          style="width: 40vw"
        />
      </div>
      <a-button type="primary" @click="onCropper"> 裁剪 </a-button>
      <img :src="cropperImg" class="croppered" v-if="cropperImg" />
    </div>
    <p v-if="cropperImg">裁剪后图片信息:{{ info }}</p>
  </PageWrapper>
</template>
<script lang="ts">
  import { defineComponent, ref, unref } from 'vue';
  import { PageWrapper } from '/@/components/Page';
  import { CropperImage } from '/@/components/Cropper';
  import img from '/@/assets/images/header.jpg';
  import { templateRef } from '@vueuse/core';

  export default defineComponent({
    components: {
      PageWrapper,
      CropperImage,
    },
    setup() {
      let info = ref('');
      let cropperImg = ref('');
      const refCropper = templateRef<HTMLElement | null>('refCropper', null);

      const onCropper = (): void => {
        unref(refCropper).croppered();
      };

      function cropperedInfo({ imgBase64, imgInfo }) {
        info.value = imgInfo;
        cropperImg.value = imgBase64;
      }

      return {
        img,
        info,
        cropperImg,
        onCropper,
        cropperedInfo,
      };
    },
  });
</script>

<style scoped>
  .container {
    display: flex;
    width: 100vw;
    align-items: center;
  }

  .cropper-container {
    width: 40vw;
  }

  .croppered {
    height: 360px;
  }

  p {
    margin: 10px;
  }
</style>