zhengyiming
16 小时以前 a48be50fb38f21c6dd7ac8545c80d511783449ab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<template>
  <div v-if="isOne && type === 'image'" class="attr-item-box">
    <div class="bg-item">
      <Button @click="cropper" type="text" long>{{ $t('cropperImg') }}</Button>
    </div>
  </div>
  <cropperDialog ref="cropperDialogRef"></cropperDialog>
</template>
 
<script setup name="CropperImg">
import useSelect from '@/hooks/select';
 
import cropperDialog from '@/components/cropperDialog.vue';
import { Utils } from '@kuaitu/core';
const { insertImgFile } = Utils;
 
const update = getCurrentInstance();
// const canvasEditor = inject('canvasEditor');
const { canvasEditor, isOne } = useSelect();
const type = ref('');
const cropperDialogRef = ref();
const cropper = () => {
  console.log('🚀 ~ cropper ~ cropper:');
  const activeObject = canvasEditor.canvas.getActiveObjects()[0];
  if (activeObject && activeObject.type === 'image') {
    console.log('🚀 ~ cropper ~ activeObject:', activeObject);
    cropperDialogRef.value.open({ img: activeObject._element.src }, async (data) => {
      console.log('🚀 ~ cropper ~ data:', data);
      const imgEl = await insertImgFile(data);
      // const width = activeObject.get('width');
      // const height = activeObject.get('height');
      // const scaleX = activeObject.get('scaleX');
      // const scaleY = activeObject.get('scaleY');
      // console.log('🚀 ~ cropper ~ scaleX:', scaleX);
      // console.log('🚀 ~ cropper ~ scaleY:', scaleY);
      activeObject.setSrc(imgEl.src, () => {
        // activeObject.set('scaleX', scaleX);
        // activeObject.set('scaleY', scaleY);
        canvasEditor.canvas.renderAll();
      });
      imgEl.remove();
    });
  }
};
 
// 替换图片
// const repleace = async () => {
//   const activeObject = canvasEditor.canvas.getActiveObjects()[0];
//   if (activeObject && activeObject.type === 'image') {
//     // 图片
//     const [file] = await selectFiles({ accept: 'image/*', multiple: false });
//     // 转字符串
//     const fileStr = await getImgStr(file);
//     // 字符串转El
//     const imgEl = await insertImgFile(fileStr);
//     const width = activeObject.get('width');
//     const height = activeObject.get('height');
//     const scaleX = activeObject.get('scaleX');
//     const scaleY = activeObject.get('scaleY');
//     activeObject.setSrc(imgEl.src, () => {
//       activeObject.set('scaleX', (width * scaleX) / imgEl.width);
//       activeObject.set('scaleY', (height * scaleY) / imgEl.height);
//       canvasEditor.canvas.renderAll();
//     });
//     imgEl.remove();
//   }
// };
 
const init = () => {
  const activeObject = canvasEditor.canvas.getActiveObjects()[0];
  if (activeObject) {
    type.value = activeObject.type;
    update?.proxy?.$forceUpdate();
  }
};
 
onMounted(() => {
  canvasEditor.on('selectOne', init);
});
 
onBeforeUnmount(() => {
  canvasEditor.off('selectOne', init);
});
</script>
<style lang="less" scoped>
.attr-item-box {
  margin-top: 8px;
}
</style>