index.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <script setup lang="ts">
  2. import { ref, nextTick, getCurrentInstance } from "vue";
  3. import Cropper from "/@/components/ReCropper";
  4. import img from "./picture.jpeg";
  5. const instance = getCurrentInstance();
  6. let info = ref<object>(null);
  7. let cropperImg = ref<string>("");
  8. const onCropper = (): void => {
  9. nextTick(() => {
  10. // @ts-expect-error
  11. instance.refs.refCropper.cropper.getCroppedCanvas().toBlob(blob => {
  12. let fileReader: FileReader = new FileReader();
  13. fileReader.onloadend = (e: ProgressEvent) => {
  14. // @ts-ignore
  15. cropperImg.value = e.target.result;
  16. // @ts-expect-error
  17. info.value = instance.refs.refCropper.cropper.getData();
  18. };
  19. fileReader.readAsDataURL(blob);
  20. }, "image/jpeg");
  21. });
  22. };
  23. </script>
  24. <template>
  25. <div style="margin: 10px">
  26. <div class="cropper-container">
  27. <Cropper ref="refCropper" :width="'40vw'" :src="img" />
  28. <img :src="cropperImg" class="croppered" v-if="cropperImg" />
  29. </div>
  30. <el-button type="primary" @click="onCropper">裁剪</el-button>
  31. <p v-if="cropperImg">裁剪后图片信息:{{ info }}</p>
  32. </div>
  33. </template>
  34. <style scoped>
  35. .cropper-container {
  36. display: flex;
  37. justify-content: space-between;
  38. align-items: center;
  39. }
  40. .el-button {
  41. margin-top: 10px;
  42. }
  43. .croppered {
  44. display: block;
  45. width: 45%;
  46. height: 360px;
  47. }
  48. </style>