<template> <v-dialog @click:outside="cancelCropImage" content-class="mb-15" scrollable width="70%" v-model="isCropImageDialogActive" style="z-index:500"> <v-card class="border-radius-20 pt-12 cropper-card-height"> <v-spacer class="d-flex justify-end"> <v-btn icon @click="cancelCropImage" class="me-15 mb-9"> <v-icon> mdi-close </v-icon> </v-btn> </v-spacer> <v-spacer class="d-flex justify-center pb-15"> <cropper class="cropper" ref="cropper" :src="cropImagePreview" :stencil-component="$options.components.CircleStencil" /> </v-spacer> <v-spacer class="d-flex justify-center justify-sm-end mb-11"> <v-btn class="me-3" width="110px" @click="cancelCropImage" text color="primary"> {{ $t("userProfile.cropReset") }} </v-btn> <v-btn class="me-15 border-radius-16" width="110px" @click="cropImage" color="primary"> {{ $t("userProfile.crop") }} </v-btn> </v-spacer> </v-card> </v-dialog> </template> <script> import { CircleStencil, Cropper } from 'vue-advanced-cropper'; import 'vue-advanced-cropper/dist/style.css'; export default { name: "cropImageDialog", components: { CircleStencil, Cropper }, data() { return { }; }, props: { isCropImageDialogActive: { type: Boolean, required: true, default: false, }, cropImagePreview: { type: String, required: true, default: '', }, }, methods: { cancelCropImage() { // const deleteFile = this.cropImagePreview.split('/') // const filename = deleteFile.pop() // this.$axios.delete(`/users/images?filename=${filename}`) // .then(response => {}) // .catch(error => console.log(error)) this.$emit('close-crop-dialog') }, cropImage() { // const result = this.$refs.cropper.getResult() // console.log(result); // const resultSplit = result.image.src.split('/') // console.log(resultSplit); // const fileDetails = resultSplit[resultSplit.length-1].split('.') // const fileURL = result.canvas.toDataURL('image/'+fileDetails[1]) // const file = this.dataURLtoFile(fileURL,fileDetails[0]+'.'+fileDetails[1]) // const payload = new FormData() // payload.append('file',file) this.$emit('upload-image-success') // this.$axios // .post( // `/trending/api/Members/UploadAvatar` // ) // .then((response) => { // //console.log(JSON.stringify(response)); // if(response && response.data && response.data.DATA && response.data.DATA.rel){ // let data = response.data.DATA.rel // if(data){ // const pictureURL = data; // console.log("change pic:" + pictureURL); // this.$emit('upload-image-success'); // } // } // }) // .catch((error) => { // console.log(error); // }); }, dataURLtoFile(dataurl, filename) { let arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, {type:mime}); }, }, } </script> <style lang="scss" scoped> .cropper { width: 85%; @media screen and (max-width: 600px) { min-height: 164px; } @media screen and (min-width: 600px) and (max-width: 960px) { min-height: 303px; } @media screen and (min-width: 961px) { min-height: 538px; } } .cropper-card-height { @media screen and (max-width: 600px) { min-height: 515px; } @media screen and (min-width: 600px) and (max-width: 960px) { min-height: 717px; } @media screen and (min-width: 961px) { min-height: 900px; } } .vue-advanced-cropper{ height: 600px !important; } .vue-advanced-cropper__stretcher{ height: 600px !important; } .vue-advanced-cropper__boundaries{ height: 600px !important; } .vue-advanced-cropper__foreground{ height: 600px !important; } .vue-advanced-cropper__image-wrapper{ height: 600px !important; } .vue-advanced-cropper__background{ height: 600px !important; } //裁切 .vue-circle-stencil .vue-circle-stencil--movable{ height: 400px !important; } .vue-bounding-box .vue-circle-stencil__bounding-box{ height: 400px !important; } .vue-preview__wrapper{ height: 400px !important; } </style>