diff --git a/src/types/slides.ts b/src/types/slides.ts
index a53277c9..a8471f44 100644
--- a/src/types/slides.ts
+++ b/src/types/slides.ts
@@ -211,6 +211,18 @@ export interface ImageElementClip {
shape: string
}
+/**
+ * 图片蒙版
+ *
+ * color: 蒙版颜色
+ *
+ * opacity: 蒙版透明度
+ */
+export interface ImageColorElementMask {
+ color: string
+ opacity: number
+}
+
/**
* 图片元素
*
@@ -242,6 +254,7 @@ export interface PPTImageElement extends PPTBaseElement {
flipH?: boolean
flipV?: boolean
shadow?: PPTElementShadow
+ colorMask?: ImageColorElementMask
}
diff --git a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue
index 6c3adc11..423ee8ed 100644
--- a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue
+++ b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue
@@ -41,6 +41,8 @@
+
+
@@ -70,6 +72,7 @@ import ElementOutline from '../common/ElementOutline.vue'
import ElementShadow from '../common/ElementShadow.vue'
import ElementFlip from '../common/ElementFlip.vue'
import ElementFilter from '../common/ElementFilter.vue'
+import ElementColorMask from '../common/ElementColorMask.vue'
const shapeClipPathOptions = CLIPPATHS
const ratioClipOptions = [
@@ -235,7 +238,7 @@ const resetImage = () => {
slidesStore.removeElementProps({
id: handleElementId.value,
- propName: ['clip', 'outline', 'flip', 'shadow', 'filters'],
+ propName: ['clip', 'outline', 'flip', 'shadow', 'filters', 'colorMask'],
})
addHistorySnapshot()
}
diff --git a/src/views/Editor/Toolbar/common/ElementColorMask.vue b/src/views/Editor/Toolbar/common/ElementColorMask.vue
new file mode 100644
index 00000000..0030290c
--- /dev/null
+++ b/src/views/Editor/Toolbar/common/ElementColorMask.vue
@@ -0,0 +1,100 @@
+
+
+
+
重新着色(蒙版):
+
+ toggleColorMask(checked as boolean)"
+ />
+
+
+
+
+
蒙版颜色:
+
+
+ updateColorMask({ color: value })"
+ />
+
+
+
+
+
+
不透明度:
+
updateColorMask({ opacity: value as number })"
+ />
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/components/element/ImageElement/BaseImageElement.vue b/src/views/components/element/ImageElement/BaseImageElement.vue
index 78c44f84..94ff89ee 100644
--- a/src/views/components/element/ImageElement/BaseImageElement.vue
+++ b/src/views/components/element/ImageElement/BaseImageElement.vue
@@ -34,6 +34,13 @@
}"
alt=""
/>
+
@@ -95,4 +102,11 @@ const { filter } = useFilter(filters)
position: absolute;
}
}
+.color-mask {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
diff --git a/src/views/components/element/ImageElement/index.vue b/src/views/components/element/ImageElement/index.vue
index 409b61eb..1b7fdbc4 100644
--- a/src/views/components/element/ImageElement/index.vue
+++ b/src/views/components/element/ImageElement/index.vue
@@ -52,6 +52,13 @@
@dragstart.prevent
alt=""
/>
+
@@ -185,4 +192,11 @@ const handleClip = (data: ImageClipedEmitData | null) => {
position: absolute;
}
}
+.color-mask {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}